c# - 如何使作为 SWIG shared_ptr 传递给非托管代码的托管代码对象保持事件状态?

标签 c# c++ delegates swig shared-ptr

所以我想让我的 C++ 代码决定何时销毁托管对象。 (因为它们作为要在 C++ 端事件上调用的委托(delegate)传递给它)。

我有一个简单的对象结构:EventGenerator + Delegates。

在我的托管方面,我有一个 EventGenerator 的包装器和一个委托(delegate)接口(interface)的包装器,我从中(使用 %feature("director"))创建托管委托(delegate)。在我的 C++ 代码中,我使用 shared_pointers 来使委托(delegate)保持事件状态。我使用了 SWIG 功能 shared_ptr

只要 EventGenerator 处于事件状态,我就需要我的托管委托(delegate)处于事件状态。然而 GC 并不知道 EventGenerator 和 Delegates 之间的任何连接。

但我不想知道对象何时在 C# 端被销毁 - 我想让 C++ 端进行控制(使用 shared_ptr)。

那么应该对 SWIG 共享指针做些什么才能在事物的托管方面维持自身?

我找到的唯一解决方案是在 C# 端扩展 EventGenerator 对象,以便向其添加委托(delegate)会将该委托(delegate)添加到列表中。它有效,但我希望有更好的解决方案。

有没有办法让 SWIG 使用共享指针引用计数器来计算这些东西? (这样只有在其 C++ 主机死后,委托(delegate)才会在托管代码中被销毁?)

最佳答案

我相信您最好的选择是使用 GCHandle.Alloc(obj, GCHandleType.Normal); 为托管对象创建一个 GCHandle;只要该句柄存在,该对象就会存在(直到您调用 .Free())。您也可以固定对象,但除非您打算直接从 C++ 访问对象指针,否则这是不必要的,并且它可以防止对象在堆压缩等过程中移动。

在进行 .NET 与 C++ 的互操作时,我强烈推荐 C++/CLI。如果您正在使用 C++/CLI,只需创建一个私有(private)引用字段:

私有(private): MyManagedClass^ fieldName;

这将存储对该对象的引用,这将防止垃圾回收。

关于c# - 如何使作为 SWIG shared_ptr 传递给非托管代码的托管代码对象保持事件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32948638/

相关文章:

c# - showdialog 重新聚焦效果自定义调用

c++ - Qt - 序列化树结构(很多指针)

c++ - 从数组中的随机位置复制到另一个数组

c# - 在 C# 中调用具有未知类型和参数数量的函数

带参数的 C# 委托(delegate)

c# - MVVM viewmodel使用async时如何设置datacontext

javascript - 无法在支付网关的通用应用程序的 Web View 中运行 JavaScript 警报

c# - 在应用程序中创建自动化宏支持

c# - 防止屏幕捕获软件捕获应用程序屏幕

ios - 自定义委托(delegate) nil 且不保存 userDefaults