[英]Marshalling double parameters with P/Invoke
我要執行的P / Invoke通話有問題。 我必須從C#程序中調用C ++類。 我有該類的源代碼,因此我所做的就是將其放在DLL項目中並創建導出函數以訪問它的主要方法。 這應該足以滿足我的需求並使事情變得簡單。
我的導出方法如下所示:
extern "C" _declspec(dllexport) void Inference(double *c1, double *c2, double *c3, double *result)
{
/* somecode */
}
這樣就可以編譯了,我可以在dumpbin
輸出中看到導出了。
現在的問題是,我無法從C#代碼中調用此方法,因為我總是會收到PInvokeStackInbalance
異常,告訴我
這可能是因為托管PInvoke簽名與非托管目標簽名不匹配。
我試着用這個調用方法:
[DllImport("InferenceEngine.dll")]
extern static unsafe void Inference(double *c1, double *c2, double *c3, double *result);
我也嘗試過這個:
[DllImport("InferenceEngine.dll")]
extern static void Inference(ref double c1, ref double c2, ref double c3, ref double result);
...這都是MSDN上記錄的兩種可能方法,但是沒有運氣。 有人對這個問題有什么線索嗎?
謝謝 !
您應該將C ++函數聲明為__stdcall
,這是P / Invoke的默認設置:
extern "C" _declspec(dllexport) void __stdcall Inference(double *c1, double *c2, double *c3, double *result);
也可以不使用C ++原型並更改P / Invoke聲明:
[DllImport("InferenceEngine.dll", CallingConvention=CallingConvention.Cdecl)]
cdecl
/ cdecl
與P / Invoke一起使用,可能是因為Windows API是stdcall
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.