从c#调用dll函数时pinvokestack失衡

本文关键字:pinvokestack 失衡 函数 dll 调用 | 更新日期: 2023-09-27 18:04:01

我正在编写一个WPF应用程序,需要调用存在于我编写的dll中的一些c++代码。我总是得到pinvokestack失衡错误,即使是最基本的测试函数。例如,在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)

…我得到一个pinvokestack失衡!!这怎么可能呢?

Thanks in advance…

汤姆

从c#调用dll函数时pinvokestack失衡

尝试指定CallingConvention.Cdecl。文档中有一个例子。桌面窗口的默认呼叫约定是Winapi;但是函数被声明为extern C

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

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