获取委托的 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(),然后调用返回的委托。

谢谢。

获取委托的 IntPtr 并调用

不能使用 GetDelegateForFunctionPointer() 获取托管函数的委托。这是来自MSDN:

不能将无效的函数指针传递给 GetDelegateForFunctionPointer.此外,您只能使用此 纯非托管函数指针的方法。你不能使用它 使用通过 C++ 或从 获取函数指针。不能使用此方法创建委托 从函数指针到另一个托管委托。

我不确定为什么你不能这样做,但我想这是因为Microsoft的公共语言运行时使用 FastCall 调用约定,但 PInvoke 不支持 FastCall。