2011-09-01 79 views
0

我的问题是类似这样的:Managing destructors of managed (C#) and unmanaged (C++) objects处理管理对象代理的图形到非托管对象

但与一捻。

我有,基本上,一个对象图,或层次结构,其中类Foo拥有到Bar类(等)的多个实例一些参考

在.NET我已经的Foo一个管理表示:维护IntPtr到真实Foo并使用P/Invoke调用实际Foo(充当代理)的方法。 (代理)执行IDisposable

代理Foo包含List<Bar>类型的只读属性。我的代理Bar代理以相同的方式工作

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

什么是处理这种情况最好的办法 - 因为我不想Foo代理管理的客户端得到一个参考的保持到Bar,并保持它周围的时间比他们做他们的Foo参考代理。

回答

0

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

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

0

也许我过分简化了这一点,但是您的Bar(代理)类应该有一个Dispose方法,该方法由父类/所有者Foo类调​​用。和许多类一样,一旦Bar对象已被处置,它应该将内部m_disposed标志设置为true,并在之后使用其任何方法时引发ObjectDisposed异常。只要内部非托管资源已清理完毕,您不应该在乎客户是否参照了托管对象Bar

+0

我用这个解决方案的问题是,你暗示'Bar'和'Foo'代理之间的父/子关系不存在。因为我不知道基础'List '项目何时更改,所以每次调用'List '属性时都会创建新的托管代理类。在'Foo'中保留每个创建的'Bar'的引用都是不可行的(这个列表可能会增长到数百万个实例)。 – Steve

+0

也许我误解了这个“我基本上有一个对象图或层次结构,其中Foo类拥有对Bar类的多个实例的一些引用(等等)”......并不意味着不暗示父母/孩子? – tcarvin

+0

在** unmanaged **的土地上,是的,'Foo'拥有几个'Bar's。但在**托管的**域中,每次检索列表时都会创建新的“Bar”代理。 – Steve