問題描述:對 PInvoke 函數“xxFunction()”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配
問題解決:1、在c#中函數聲明處改一個參數,[DllImport("xx.dll", EntryPoint=“xxFunction”, CallingConvention = CallingConvention.Cdecl)]調用時不變
2、在c++代碼中改對應的c++函數參數從extern“C” _declspec(dllexport) void xxFunction()改成
extern“C” _declspec(dllexport) void __stdcall xxFunction()
問題分析:
在c++WIN32程序中有三種calling convention(呼叫約定):__cdecl, __stdcall, __fastcall默認為__cdecl,而c#中默認為CallingConvention =CallingConvention.Winapi,兩個平台呼叫約定不一致,所以會出現提示的不匹配錯誤。
__cdecl為調用函數即C#中清理堆棧中保存的參數。參數的大小不確定時用這個,比如string
__stdcall對應c#中CallingConvention =CallingConvention.Winapi,它由c++中函數自動清理。
Win32 calling convention(呼叫約定)的三種約定具體分析見http://www.cnblogs.com/super119/archive/2011/04/10/2011304.html
