c# - 从 C++ 到 C# 的回调

标签 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++ 函数指针并调用最后一个函数?

最佳答案

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

您可以使用 C++/CLI 使 shim 观察器实现也理解 C# 委托(delegate)的接口(interface),或者您可以使用标准 C++ 使 shim 观察器实现接口(interface)并调用函数指针; C# 委托(delegate)可以转换为函数指针。

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


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

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

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

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

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

然后声明使用它的函数:

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

请注意, native 代码中使用的函数指针对于垃圾收集器是不可见的。只要函数指针被存储,您有责任让委托(delegate)保持事件状态。

关于c# - 从 C++ 到 C# 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179691/

相关文章:

c# - 如何使用 LinQ 提高性能

C++ std::function 找不到正确的重载

c++ - 输入未清除

c++ - 在编译时检测 C++ 代码中的重复工作

c++ - Win32 的单读者单作者队列

c# - WP8 获取应用信息

c# - RichTextBox 选择突出显示

C#打印函数隐藏窗口

c# - 将我的 DataGridView 绑定(bind)到引用游标

c++ - 问题\如何激活 Elecard Direct Show Decoder 过滤器