gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:12:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com