我有一个用 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/