如何在C ++ / CLI中将委托^传递给本机类

问题描述

我有一个母语班

public NativeClass:
{
public:
    typedef void(*Func)(cv::UMat image);

    void setFunc(Func func);
}

,并希望将一个函数作为参数传递给托管类。

ref ManagedClass:
{
    public:
        ManagedClass()
        {
           NativeClass* nativeClass = new NativeClass();
           nativeClass.setFunc(doSomething);
        }


    private:
        doSomething(cv::UMat image)
        {
            //do something
        }
}

但是它似乎不起作用。我怎样才能使它正常工作?

解决方法

在将委托作为函数指针传递之前,需要首先创建一个委托。

在C#中,您只需要引用没有括号的方法名称。在C ++ / CLI中,您需要显式调用委托构造函数,并且需要传递对象的显式参数以调用方法,并以C ++样式调用方法。

MyDelegate^ del = gcnew MyDelegate(this,&ManagedClass::doSomething);
// Explicit ctor  ^^^^^^^^^^^^^^^^
// Pass the object to be called on ^^^^
// Pass the method in the C++ style      ^^^^^^^^^^^^^^^^^^^^^^^^^^

一旦有了,就可以将委托传递给采用原始函数指针的方法。它知道如何将托管委托对象转换为函数指针。 Microsoft's documentation中有一个很好的例子。您必须一定要始终保持托管委托对象 。一旦托管委托被垃圾回收,原始函数指针就会停止工作。

一旦有了,就需要查看参数类型cv::UMat。我不知道它是什么类型或在哪里得到的,但是您可能需要在托管端,非托管端或两者上调整参数类型。 (这就是为什么我在上面的示例中未声明委托类型的原因;我不确定是否可以正常工作,所以我将其保留为通用类型。如果一切正常,那么您可以使用Action<cv::UMat>作为委托类型。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...