从 C# 调用 dll 函数时的 PInvokeStackImbalance

发布于 2024-11-27 05:51:28 字数 464 浏览 0 评论 0原文

我正在编写一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

暮凉 2024-12-04 05:51:28

尝试指定 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 as extern C.

天赋异禀 2024-12-04 05:51:28

您的 [DllImport] 声明缺少 CallingConvention。必需的,您的测试函数是 Cdecl,因为您没有使用 __stdcall 关键字。 __cdecl 和 __stdcall 之间的区别在于调用后清理堆栈的方式。 __cdecl 是大多数 C++ 编译器(包括 Microsoft 的编译器)的默认值。要在 C++ 端修复它,您可以像这样声明它:

extern "C" __declspec(dllexport) 
void __stdcall Test( int foo);

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:

extern "C" __declspec(dllexport) 
void __stdcall Test( int foo);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文