[英]How to call a C++ delegated function from C#, when C++ call C# functions?
[英]How to call a C++ function from c#
我正在嘗試調用C#大學提供的C ++函數。 他為我提供了一個dll和以下頭文件。
#include "../libs/tfvo.h"
extern "C" __declspec(dllexport) vector<double> fvm(
vector<double> yearFractions,
vector<double> discountFactors,
vector<double> weightings,
double alpha_meanReversion,
double sigma_meanReversion,
double alpha_shortRate,
double alpha_meanReversion,
double sigma_shortRate,
vector<double> startingValues = vector<double>(3,0.01));
我正在使用以下C#代碼來調用上述c ++函數,這將導致以下錯誤。
“試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。”
如何在C#中調用此函數? C ++代碼是否需要更改?
var result = SimpleDllTest.testWrapper(); // In a console app
class SimpleDllTest
{
[DllImport("fvm.dll")]
public static extern IntPtr fitVasicekModel(
IntPtr yearFractions,
IntPtr weightings,
double alpha_meanReversion,
double sigma_meanReversion,
double alpha_shortRate,
double sigma_shortRate,
IntPtr startingValues
);
public static double [] testWrapper()
{
var t = new double[] { 0.1, 1.2 };
var v = new double[] { 0.1, 1.2 };
int size = Marshal.SizeOf(t[0]) * t.Length;
IntPtr pnt = Marshal.AllocHGlobal(size);
Marshal.Copy(t, 0, pnt, t.Length);
int sizev = Marshal.SizeOf(v[0]) * v.Length;
IntPtr pntv = Marshal.AllocHGlobal(sizev);
Marshal.Copy(v, 0, pntv, v.Length);
IntPtr result = fitVasicekModel(pnt, pnt, 1, 1, 1, 1, pntv);
try
{
return (double[])Marshal.PtrToStructure(result , typeof(double[]));
}
finally
{
// Free the pointer here if it's allocated memory
}
}
}
更多背景信息:我的大學已經開發了幾個與財務相關的計算,我希望我們能以最小的努力在另一個C#應用程序中重用他的整個庫。 我和他在這方面的經驗都很少(創建可導出的C ++代碼並在C#中使用它),因此將歡迎其他任何技巧。
您沒有機會直接從C#調用此函數。 vector<>
與C# int[]
沒有關系。
最好的選擇是將C#庫包裝在一個托管的C ++包裝器中,這樣您就可以在導入過程中將C#類型轉換為C ++類型,並在導出過程中將C ++類型映射為C#類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.