1. 程式人生 > >C#呼叫c程式碼生成的dll,報PInvoke 簽名與非託管的目標籤名不匹配

C#呼叫c程式碼生成的dll,報PInvoke 簽名與非託管的目標籤名不匹配

C# 在呼叫c程式碼生成的dll時,報錯:對 PInvoke 函式“TestJBIG!TestJBIG.JbigHelper::jbigDecode”的呼叫導致堆疊不對稱。原因可能是託管的 PInvoke 簽名與非託管的目標籤名不匹配。請檢查 PInvoke 簽名的呼叫約定和引數與非託管的目標籤名是否匹配。

處理方法:

確認c程式碼生成的dll的呼叫約定是和呼叫時一致的。



上圖是vs裡面生成C的dll的專案屬性,裡面的c/c++高階中呼叫約定需和c#在呼叫時的的設定一致,c#程式碼如下:

[DllImport("Jbig.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int test(byte[] endata, int enlen, ushort w, ushort h, byte[] data, ref int datalen);

這裡我用的是Cdecl,其實都約定為用StdCall(標準方式)可能會更好。

捐贈: 
BTC: 1NTom3PgUct3WNmnBYNq5KGDQvY3MXs8dJ
ETH:0x8509f0F37497e094924F5c2e776e0dA522c57e43