我正在编写一个WPF应用程序,需要调用我编写的dll中存在的一些C ++代码。我总是得到PInvokeStackImbalance错误,即使是最基本的测试功能。例如,在C ++ DLL中:
extern "C" __declspec(dllexport) void Test( int foo);
该功能无效。 c#侧看起来像这样:
[DllImport("myDll.dll", CharSet = CharSet.Auto)]
private static extern void Test( int foo);
我称之为c#函数是这样的:
试验(1)
...我得到了一个PInvokeStackImbalance !!怎么会这样?
提前致谢...
汤姆
答案 0 :(得分:5)
尝试指定CallingConvention.Cdecl。文档中有一个例子。桌面窗口上的默认调用约定为Winapi
;但是你的函数被声明为extern C
。
答案 1 :(得分:2)
您的[DllImport]声明缺少CallingConvention。必需,您的Test函数是Cdecl,因为您没有使用__stdcall关键字。 __cdecl和__stdcall之间的区别在于调用后堆栈被清理的方式。 __cdecl是大多数C ++编译器的默认设置,包括Microsoft的编译器。要在C ++端修复它,你可以这样声明:
extern "C" __declspec(dllexport)
void __stdcall Test( int foo);