获取委托的 IntPtr 并调用
本文关键字:调用 IntPtr 获取 | 更新日期: 2023-09-27 18:35:10
为了模拟来自c ++的调用,我正在尝试以下代码
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.Program+CppFuncDelegate::Invoke' 使堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 调用约定和 PInvoke 签名匹配的参数 目标非托管签名。
谁能告诉我我做错了什么?
注意:请不要告诉我要做动作。调用();这不是这个练习的目的。我想获取委托的 IntPtr 句柄并使用 GetDelegateForFunctionPointer(),然后调用返回的委托。
谢谢。
不能使用 GetDelegateForFunctionPointer() 获取托管函数的委托。这是来自MSDN:
不能将无效的函数指针传递给 GetDelegateForFunctionPointer.此外,您只能使用此 纯非托管函数指针的方法。你不能使用它 使用通过 C++ 或从 获取函数指针。不能使用此方法创建委托 从函数指针到另一个托管委托。
我不确定为什么你不能这样做,但我想这是因为Microsoft的公共语言运行时使用 FastCall 调用约定,但 PInvoke 不支持 FastCall。