所以我想允许我的C ++代码决定何时销毁托管对象。 (因为它们作为委托传递给它,以便在C ++端事件上调用)。
我有一个简单的对象结构:EventGenerator + Delegates。
在我的托管方面,我有一个EventGenerator的包装器和一个Delegates接口的包装器,从中创建托管委托(使用%feature("director")
)。在我的C ++代码中,我使用shared_pointers来保持委托活着。我使用了SWIG功能shared_ptr
。
只要EventGenerator还活着,我就需要我的托管代表才能活着。然而GC并不知道EventGenerator和Delegates之间的anu连接。
但是我不想知道对象在C#方面何时被破坏 - 我想让C ++方面采取控制(使用shared_ptr' s)。
那么SWIG共享指针应该做些什么来维持自己的管理?
我找到的唯一解决方案是在C#端扩展EventGenerator对象,以便向其添加委托将该委托添加到列表中。它的工作原理我希望有一个更好的解决方案。
有没有办法让SWIG帐户使用共享指针引用计数器? (这样只有在C ++主机死了之后代理才会在托管代码中销毁?)
答案 0 :(得分:1)
我相信你最好的办法是使用GCHandle.Alloc(obj,GCHandleType.Normal)为托管对象创建一个GCHandle;只要存在该句柄,该对象就会存在(直到您调用.Free())。您也可以固定对象,但除非您要从C ++直接访问对象指针,否则这是不必要的,它可以防止在堆压缩等过程中移动对象。
在使用C ++进行.NET互操作时,我强烈推荐使用C ++ / CLI。如果你正在做C ++ / CLI,只需创建一个私有引用字段:
private:
MyManagedClass^ fieldName;
这将存储对象的引用,这将防止垃圾回收。