如何保持作为SWIG shared_ptr's传递给非托管代码的托管代码对象的活动状态

本文关键字:非托管代码 对象 托管代码 活动状态 何保持 SWIG shared ptr | 更新日期: 2023-09-27 18:15:59

所以我想让我的c++代码决定何时销毁托管对象。(因为它们作为委托传递给它,以便在c++副事件中调用)。

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

在我的托管端,我有EventGenerator的包装器和delegate接口的包装器,从中(使用%feature("director"))我创建托管委托。在我的c++代码中,我使用了shared_pointer来保持委托有效。我使用SWIG特性shared_ptr

我需要我的托管委托是活的,只要EventGenerator是活的。然而,GC并不知道EventGenerator和delegate之间的u连接。

然而,我不想知道对象何时在c#端被销毁-我想允许c++端控制(使用shared_ptr's)。

那么,应该对SWIG共享指针做些什么,使其能够在受管理的方面维持自身呢?

我发现的唯一解决方案是在c#端扩展EventGenerator对象,以便向它添加一个委托将该委托添加到列表中。它有效,但我希望有一个更好的解决方案。

是否有任何方法使SWIG帐户使用共享指针ref计数器这样的事情?(这样委托就会在托管代码中被销毁,只有在它的c++宿主死亡之后?)

如何保持作为SWIG shared_ptr's传递给非托管代码的托管代码对象的活动状态

我认为最好的办法是使用GCHandle创建一个管理对象的GCHandle。Alloc (obj GCHandleType.Normal);只要该句柄存在,该对象就会存在(直到调用. free())。你也可以固定对象,但除非你要直接从c++访问对象指针,否则这是不必要的,它可以防止对象在堆压缩等过程中被移动。

在与c++进行。net互操作时,我强烈推荐c++/CLI。如果使用c++/CLI,只需创建一个私有引用字段:

private: MyManagedClass^ fieldName;

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