将非托管方法作为回调传递给托管C ++ / CLI类

马里奥·桑兹·戈麦斯(Mario Sanz Gomez)

我想将C ++成员函数作为回调传递给C#项目。我在C ++ / CLI中还有其他项目,我想通过它完成。

因此,在我的C ++ / CLI项目的非托管C ++中,我有一个函数对象:std::function<void(int)>callback;

该函数来自我的C ++项目,并且工作正常,为避免上一步,我将其保存为示例。现在,我想将此回调函数传递给我的C#项目。为此,我在非托管C ++中创建了一个方法,将其传递给托管C ++,从这一点开始,最终将其传递给C#。我想要这样的东西:

// Unmanaged class
public class Wrapper
{
public:
    std::function<void(int)>callback;

    void ReturnToCallback(int data)
    {
        callback(data);
    }

    void PassCallback()
    {
        NETWrapper netWrapper;
        netWrapper.TestCallback(ReturnToCallback);
    }
};

//Managed class
public ref class NETWrapper
{
public:
    void TestCallback(Action<int>^ callback)
    {
       StartGenerator^ startGen = gcnew StartGenerator(callback);
    }
};

// C# 
public class StartGenerator
{
    private Communication comm;

    public StartGenerator(Action<int> callback)
    {
        comm = Communication.Instance;
        comm.callback = callback;
    }
}

当然,此解决方案在编译时会给我一个错误:

错误3错误C3867:'IfaceXXX :: Wrapper :: ReturnToCallback':函数调用缺少参数列表;使用'&IfaceXXX :: Wrapper :: ReturnToCallback'创建指向成员d:\ XXX.h的指针

我尝试了其他方法,例如获取函数指针的委托,以便可以在托管C ++上工作并将其传递给C#,但是我无法正确实现它。您认为尝试此操作的最佳方法是什么?

本·沃格特
  1. 制作Wrapper::callback的指针std::function
  2. 将包装器更改为ref class

而已。

public ref class Wrapper
{
public:
    std::function<void(int)>* callback;

    void ReturnToCallback(int data)
    {
        (*callback)(data);
    }

    void PassCallback()
    {
        NETWrapper netWrapper;
        netWrapper.TestCallback(gcnew Action<int>(this, &Wrapper::ReturnToCallback));
    }
};

然后,您确实需要管理std::function现在的生命周期,也许clr_scoped_ptr可以向您展示如何做到这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将子类传递给方法,但将超类作为参数?

将春豆注入非托管类

将对Spring托管bean的引用传递给非托管类?

将非活动类中的回调方法结果传递给android活动类?

将Cython类对象作为参数传递给C函数

如何将IntPtr从非托管C ++ CLR托管代码传递给方法?

C ++ / CLI什么类包含全局函数?

传递typescript类方法作为回调

将类方法作为块传递给ruby

将指针类方法作为参数传递给另一个类方法C ++

Python:将类成员函数传递给另一个类的回调

将引用作为参数传递给类的正确方法

如何将C ++类函数作为回调传递

将类作为回调方法传递方法以请求动画帧

如何将类作为可选参数传递给方法?

使用C#在非托管代码中将委托传递给回调函数

如何将非静态方法从特定类作为参数传递给Function

C ++:将类作为参数传递给其他类的方法

如何从C ++ / CLI类返回托管字符串

将托管引用(this)传递给非托管代码并调用托管回调

包装C#的C ++ CLI类

将类传递给回调函数的最佳方法

将内联构造的类作为类参数传递给方法

我何时将类的实例作为self传递给方法?

C#将类作为参数传递给方法,并在其中调用静态方法

将类的方法作为参数传递给C ++中的另一个类

将方法作为道具传递给类静态函数

将额外的引用参数作为参数传递给类中的回调对象

将类方法作为回调传递给javascript中的另一个类