簡體   English   中英

用P / Invoke編組雙參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM