與問題完全相同。如何創建一個可以從c#調用的cpp函數作爲參數
我有一對庫,一個在cpp中,另一個在c#中。我已經有幾個(cpp)函數可以從c#調用,但只有簡單的參數(數組和基元)。
如何傳遞函數?
我已經閱讀了大量的答案在這裏,他們都沒有幫助我 - 我失蹤了什麼?
下面是我有:
delegate double ManagedFunction(cli::array<System::Double>^ xIn);
...
...
static int LevMar(
ManagedFunction^ function,
cli::array<System::Double, 1>^ x0,
cli::array<System::Double, 1>^ xHigh,
cli::array<System::Double, 1>^ xLow,
int maxIters//,
//double tolerance
) {
IntPtr stubPointer = Marshal::GetFunctionPointerForDelegate(function);
Unmanaged::WrapperClass::functionToMinimize = static_cast<Unmanaged::UnmanagedFunction>(stubPointer.ToPointer());
int m = x0->Length; //nDim
int N = 1; //observables dimension
double* fx = new double[m];
double* x0Arr = Utility::CreateDoubleArrayFromManaged(x0);
double* xLowArr = Utility::CreateDoubleArrayFromManaged(xLow);
double* xHighArr = Utility::CreateDoubleArrayFromManaged(xHigh);
double info[LM_INFO_SZ];
double tolerance[5];
tolerance[0] = 0.01; //scale factor for initial \mu/
tolerance[1] = tolerance[2] = tolerance[3] = tolerance[4] = 1.0e-5;
dlevmar_bc_dif(Unmanaged::WrapperClass::functionToPassToLevMar, x0Arr, fx, m, N, xLowArr, xHighArr, NULL, maxIters, tolerance, info, NULL, NULL, NULL);
int nElements = sizeof x0Arr/sizeof x0Arr[0];
for (int i = 0; i < nElements; i++) x0[i] = x0Arr[0];
return 0;
}
而這一切編譯,但我沒能還沒有測試它,因爲我不能從C#調用它;這是我試過的:
CostDelegate costDelegate = new CostDelegate(cost);
XXXCpp.Minimization.LevMar(costDelegate, x0, xhigh, xlow, 1000);
但它告訴我它不能從'CostDelegate'投射到'ManagedFunction'。兩者都是代表,並且都具有相同的簽名。
我怎樣才能實現我在這裏的東西?
有沒有辦法做到這一點,以便在C#中,當我調用函數,我可以只是傳遞一個函數,而不必創建一個委託(即我可以寫的CPP,使功能需要Func<double[], double>
而不是這個'ManagedFunction'對象)?
從你的代碼不是很清楚你想要做什麼。例如。它們是什麼類型的Unmanaged :: WrapperClass :: functionToPassToLevMar以及它分配的位置。你能否提供一個簡單的例子,而不依賴於其他類? – opetroch