从C ++到C#的回调

时间:2014-10-03 13:16:52

标签: c# c++

我在C ++中有一个主题/观察者系统:

#include <vector>
class IObserver
{
public:
    virtual void valueChanged(float pos) = 0; 
};

class Subject
{
public:
    static Subject *instance();
    void subscribe(IObserver *observer);
private:
    static Subject*                    m_instance;
    std::vector<IObserver*>            m_observers;
};

我需要在C#中实现一个观察者并订阅该主题。 我该怎么做?

我可以使用函数指针:

typedef void (*ValueChangedFunc)(float pos);
void SubscribeTovalueChanged(ValueChangedFunc func); // global but works on singleton

如何将C#成员函数转换为C ++函数指针并调用最后一个函数?

1 个答案:

答案 0 :(得分:5)

C#无法实现C ++接口,需要从C ++完成。

您可以使用C ++ / CLI创建一个实现同样理解C#委托的接口的填充程序观察器,或者您可以使用标准C ++来创建一个实现接口并调用函数指针的填充程序观察器; C#委托可以转换为函数指针。

最后一种方法是让C ++代码使用C#可以实现的完整的COM接口(在IDL中描述),而不是最小的C ++接口。


对于带有函数指针的新代码:

首先,在C ++端指定调用约定。

typedef void (__stdcall *ValueChangedFunc)(float pos);
void __stdcall SubscribeToValueChanged(ValueChangedFunc func); // global but works on singleton

然后声明一个与函数指针typedef匹配的委托。

[UnmanagedFunctionPointer(CallingConvention.Stdcall)]
delegate void ValueChangedFunc(float);

然后声明消耗它的函数:

[DllImport(...)]
void SubscribeToValueChanged(ValueChangedFunc func);

请注意,本机代码中使用的函数指针对垃圾收集器不可见。只要存储了函数指针,保持委托活动就是你的责任