2

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

提前致谢...

汤姆

4

2 回答 2

4

尝试指定CallingConvention.Cdecl。文档中有一个示例。默认调用约定是Winapi在桌面窗口上;但是你的函数被声明为extern C.

于 2011-07-29T12:58:39.187 回答
3

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

extern "C" __declspec(dllexport) 
void __stdcall Test( int foo);
于 2011-07-29T13:01:06.473 回答