从C#调用dll函数时的PInvokeStackImbalance

时间:2011-07-29 12:51:48

标签: c# pinvoke dllimport dllexport

我正在编写一个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 !!怎么会这样?

提前致谢...

汤姆

2 个答案:

答案 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);