【问题标题】:Handling Graphs of Managed Object Proxies to Unmanaged Objects将托管对象代理图处理为非托管对象
【发布时间】:2011-10-26 04:06:42
【问题描述】:

我的问题和这个类似: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 被释放时,它会释放它所有的孩子(包括所有Bars)。

处理这种情况的最佳方法是什么 - 因为我不希望 Foo 代理的托管客户端获得对 Bar 的引用并保持比他们的引用更长的时间到Foo 代理。

【问题讨论】:

    标签: .net pinvoke


    【解决方案1】:

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

    【讨论】:

    • 我对这个解决方案的问题是,你暗示了 BarFoo 代理之间不存在的父/子关系。因为我不知道底层List<Bar> 项目何时更改,所以每次调用List<Bar> 属性时我都会创建新的托管代理类。在 Foo 中保留对曾经创建的每个 Bar 的引用是不可行的(此列表可能会增长到数百万个实例)。
    • 也许我误解了这个“本质上,我有一个对象图或层次结构,其中类 Foo 拥有对类 Bar 的多个实例的一些引用(等)”......并不拥有暗示这不意味着父母/孩子?
    • unmanaged 土地上,是的,Foo 拥有多个 Bars。但在托管领域,每次检索列表时,我都会创建新的Bar 代理。
    • 您可能应该知道 - 我已经通过实施引用计数方案解决了我的问题。我只是希望有人可能有其他想法。但是,老实说,我无法绕过引用计数。我已经简化了这个问题,但实际上,问题更复杂——即使忽略我在这里发布的问题,我也需要引用计数。
    【解决方案2】:

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

    我希望有其他方法,但归根结底,它很简单,而且确实是正确的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2017-08-16
      • 2011-08-05
      相关资源
      最近更新 更多