在C中定義的函數++ DLL是:如何將函數指針從C#傳遞給C++ Dll?
static double (*Func1)(double);
EXTERN_C __declspec(dllexport) __stdcall double TestDelegate(double (*fun)(double))
{
Func1 = fun;
return Func1(25.0);
}
void My_Real_purpose()
{
SomeClass a;
a.SetFunction(Func1);//Define behaviour of a by C# in runtime
a.DoSomething();//Even I want it runs in another thread!
}
我試圖將它調用在C#這樣的:
class A
{
[DllImport("DllName.dll")]
public extern static double TestDelegate(IntPtr f);
public delegate double MyFuncDelegate(double x);
public static double MyFunc(double x)
{
return Math.Sqrt(x);
}
static MyFuncDelegate ff;
static GCHandle gch;
public static double Invoke()
{
ff = new MyFuncDelegate(MyFunc);
gch = GCHandle.Alloc(ff);
double c = TestDelegate(Marshal.GetFunctionPointerForDelegate(ff));//Error occurs this line
gch.Free();
return c;
}
}
它不error.But被編譯當它運行時,VS2012顯示錯誤「訪問違規例外」。
我已經搜索並嘗試了很多方法,例如傳遞委託而不是IntPtr,但所有這些方法都失敗了。
那麼,在包含函數指針的dll中使用API函數的正確方法是什麼?或者如何實現「My_Real_purpose」函數?
的可能的複製[妙傳C++函數指針由C#調用 - 函數的參數包括寬字符串(LPCWSTR)](http://stackoverflow.com/questions/6282264/pass-a-function-pointer-from-c-to-be-called-by-c-sharp-函數參數) –
我刪除了COM標籤,因爲這個問題與COM無關; PInvoke標籤更合適。 –
委託聲明是錯誤的,但這不足以解釋AVE。確保您知道如何調試C++代碼,以便您可以診斷此崩潰。顯示你得到的堆棧跟蹤。 –