从 C# 调用 dll 函数时的 PInvokeStackImbalance
我正在编写一个 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# 函数:
Test(1)
...我得到一个 PInvokeStackImbalance!怎么会这样呢?
预先感谢...
汤姆
I'm writing a WPF app that needs to call some C++ code that exists in a dll I've written. I'm always getting PInvokeStackImbalance errors, even with the the most rudimentary test functions. Eg, in the C++ dll:
extern "C" __declspec(dllexport) void Test( int foo);
The function does nothing. The c# side looks like this:
[DllImport("myDll.dll", CharSet = CharSet.Auto)]
private static extern void Test( int foo);
And I call this c# function like so:
Test(1)
... and I get a PInvokeStackImbalance!! How can this be?
Thanks in advance...
Tom
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
尝试指定 CallingConvention.Cdecl。文档中有一个示例。桌面 Windows 上默认的调用约定是
Winapi
;但您的函数被声明为extern C
。Try to specify CallingConvention.Cdecl. There is an example in the doc. The default calling convention is
Winapi
on desktop windows; but your function is declared asextern C
.您的 [DllImport] 声明缺少 CallingConvention。必需的,您的测试函数是 Cdecl,因为您没有使用 __stdcall 关键字。 __cdecl 和 __stdcall 之间的区别在于调用后清理堆栈的方式。 __cdecl 是大多数 C++ 编译器(包括 Microsoft 的编译器)的默认值。要在 C++ 端修复它,您可以像这样声明它:
Your [DllImport] declaration is missing the CallingConvention. Required, your Test function is Cdecl since you didn't use the __stdcall keyword. The difference between __cdecl and __stdcall is the way the stack gets cleaned up after the call. __cdecl is the default for most C++ compilers, including Microsoft's. To fix it on the C++ side, you'd declare it like this: