我有一个未管理的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++项目规格说明中了解到,对于函数来说,null作为参数和0作为返回值都是有效的输入。当我尝试调用它时,似乎可以正常工作,但是在退出时,我会得到以下错误:
我已经尝试了几乎所有我能想到的方法(unsafe是最后的手段),但是我无法找到任何一种方法可以运行函数而不会导致堆栈不平衡。还有其他什么方法可以尝试吗?检测到PInvokeStackImbalance
调用PInvoke函数'...::Invoke'导致堆栈不平衡。这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。
static extern
声明会更容易些。 - H H