处理托管对象代理到非托管对象的图形

时间:2011-09-01 20:07:54

标签: .net pinvoke

我的问题与此类似:Managing destructors of managed (C#) and unmanaged (C++) objects

但有一点扭曲。

本质上,我有一个对象图或层次结构,其中类Foo拥有对类Bar的多个实例的引用(等等)

在.NET中,我有一个Foo的托管代表,它维护IntPtr到真实Foo并使用P / Invoke调用真实Foo上的方法(作为代理人。)

Foo(代理)的托管实现实现了IDisposable

代理Foo包含List<Bar>类型的只读属性。

我的托管Bar代理以相同的方式工作(对于它所代表的真实IntPtr,保持Bar

当真正的Foo被释放后,它会释放所有的孩子(包括所有Bar)。

处理此方案的最佳方法是什么 - 因为我不希望Foo代理的托管客户端获取对Bar的引用并保持比他们引用了Foo代理。

2 个答案:

答案 0 :(得分:0)

也许我过度简化了这一点,但是你的Bar(代理)类应该有一个Dispose方法,由父/所有者Foo类调用。和许多类一样,一旦Bar对象被处理掉,它应该将内部m_disposed标志设置为true,如果之后使用任何方法,则抛出ObjectDisposed异常。只要内部非托管资源已被清除,您就不应该关心客户端是否有对托管Bar对象的引用。

答案 1 :(得分:0)

我刚刚实施了一个简单的引用计数方案。

我希望会有其他方式,但是,在一天结束时,它很简单,而且确实是正确的解决方案。