我有一个具有以下签名的非托管 C++ 函数:
int function(char* param, int ret)
我试图从 C# 调用它:
unsafe delegate int MyFunc(char* param, int ret);
...
int Module = LoadLibrary("fullpathToUnamanagedDll");
IntPtr pProc = GetProcAddress(Module, "functionName");
MyFunc func = (MyFunc)System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(pProc, typeof(MyFunc));
unsafe
{
char* param = null;
int ret = 0;
int result = func(param, ret);
}
据我从旧的 C++ 项目规范中可以看出,param的 null 和ret的0都是函数的有效输入。当我尝试调用它时,它似乎可以工作,但是在退出时出现以下错误:
检测到 PInvokeStackImbalance
调用 PInvoke 函数 '...::Invoke' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我已经尝试了几乎所有我能想到的东西(不安全是最后的手段),但是我找不到任何方法来运行该函数而不会得到不平衡的堆栈。还有什么我可以尝试的吗?