为了模拟从C++调用,我想下面的代码获得委托的IntPtr的和调用
private delegate void CppFuncDelegate(string message);
private static void Main(string[] args)
{
Console.WriteLine("+++ BEGIN TEST +++");
Action<string> action = str => Console.WriteLine("Received:" + str);
IntPtr delegatePtr = action.Method.MethodHandle.GetFunctionPointer();
CppFuncDelegate cppFuncDelegate = (CppFuncDelegate)
Marshal.GetDelegateForFunctionPointer(delegatePtr,
typeof(CppFuncDelegate));
cppFuncDelegate.Invoke("Hello");
}
,但我得到
检测PInvokeStackImbalance。 对PInvoke函数'Test!Test.Program + CppFuncDelegate :: Invoke' 的调用已使堆栈不平衡。这很可能是因为托管PInvoke 签名与非托管目标签名不匹配。检查 PInvoke签名的调用约定和参数是否匹配 目标非托管签名。
谁能告诉我什么,我做错了什么?
注意:请不要告诉我做action.Invoke();这不是这个练习的重点。我想让IntPtr处理委托并使用GetDelegateForFunctionPointer(),然后调用返回的委托。
谢谢。
您是否检查过PInvoke签名的调用约定是否与目标非受控签名匹配? – dtb
@dtb'CppFuncDelegate'接受一个字符串并返回void,并且我将action的委托声明为'Action';所以我认为他们匹配。有没有其他方法来检查PInvoke签名? –
我不想谈论参数,我正在谈论调用约定。 – dtb