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

问题描述 投票:0回答:1

我想将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

的指针

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

c# c++ callback delegates c++-cli
1个回答
0
投票
  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的生存期,也许my clr_scoped_ptr可以告诉您如何执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.