c# - 将 C# 函数指针传递到 C++/CLI 互操作 dll

标签 c# c++

我正在尝试将一个函数指针从 C# 传递到 C++/CLI,并收到一个 Windows 编译器错误,指出此语言 (C#) 不支持 ManagedTakeCallback 函数——我定义了C++/CLI 互操作中的 ManagedTakeCallback。我的代码看起来像

C# 应用程序:

namespace ManagedConsoleApplication

{

class Callback
    {
        public delegate double DelegateAdd(double value1, double value2);

        public static double CallbackAdd(double value1, double value2)
        {
            return value1 + value2;
        }

        public static DelegateAdd delegateCallback = new DelegateAdd(Callback.CallbackAdd); //declare as static to prevent GC

    }

    class Program
    {
       // [DllImport("InteropDLL.dll", CallingConvention = CallingConvention.StdCall)]
       // public static extern void ManagedCallback(IntPtr pCallback);
        static void Main(string[] args)
        {
            InteropDLL io = new InteropDLL(); 
            Console.WriteLine("The Add return = {0}", io.ManagedAdd(3, 2));
            Console.WriteLine("Pass CallBack to Unmanaged code");
            Callback cb = new Callback();
            IntPtr intptr_delegate = Marshal.GetFunctionPointerForDelegate(Callback.delegateCallback); //convert delegate to function pointer which can be used by unmanaged code
            Console.WriteLine("The callback return is {0}", io.ManagedTakeCallback(intptr_delegate)); 
            Console.WriteLine("Please hit Enter to exit");
            String value = Console.In.ReadLine();
            //Console.WriteLine("End of program ", value);
        }
    }
}

和,

C++/CLI 互操作 dll h 和 cpp 文件:

//HEADER

namespace Interop
{

typedef double (__stdcall *PCallback)(double value1, double value2);

    public ref class InteropDLL
    {
    public:
        double ManagedAdd(double value1, double value2);

    public:
        double ManagedTakeCallback(PCallback pCallback);
    };
}

//CPP

double Interop::InteropDLL::ManagedAdd(double value1, double value2)
{
    return NativeAdd(value1, value2);
}

double Interop::InteropDLL::ManagedTakeCallback(PCallback pCallback)
{
    return NativeTakeCallback();
}

然后 C++/CLI 互操作层调用 C DLL。我可以调用 ManagedAdd 互操作函数;但是,如果添加了 ManagedTakeCallback,则会出现 windows 编译器错误。我怀疑 C# 应用程序未通过 ManagedTakeCallback 函数正确编码函数指针,或者 C++/CLI 端的签名不正确?我将不胜感激任何见解。

最佳答案

这是来自现场的评论:

“但是 C# 不支持 C++ 函数指针,所以我们不能在这里调用 C++ 函数指针。C# 只有 Delegate 对象,我们必须通过 Marshal.GetDelegateForFunctionPointer 将函数指针转换为 Delegate。它在 System. Runtime.InteropServices 如下:


public static Delegate GetDelegateForFunctionPointer (
      IntPtr ptr,
      Type t)

完整答案请看链接: http://www.codeproject.com/Articles/27298/Dynamic-Invoke-C-DLL-function-in-C

关于c# - 将 C# 函数指针传递到 C++/CLI 互操作 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247327/

相关文章:

c# - volatile 变量有用吗?如果是,那么什么时候?

c# - 如何使用 Selenium WebDriver 和 C# 单击复选框

c++ - 为什么像虚幻引擎这样的大项目要自己写容器类?

c++ - Android Studio 中的 Gradle 任务排序问题

c++ - `Error using mex Supported compiler not detected` : can't install a CUDA-compatible C++ compiler for MATLAB

c# - Sitecore::无法实现 png、jpg 格式的重定向请求

c# - C# 如何反转字节数组的顺序?

c# - 尝试使用另一种形式的功能但不工作

c++ - 按基类将派生对象存储在 vector 中,并在删除时将它们返回给派生对象

c++ - 使用 C++ 原子库,我应该使用什么内存顺序进行加载,然后进行比较交换?