我应该将来自“哑”托管包装器的对象作为非托管资源处理本机COM dll吗?

时间:2011-12-22 11:49:20

标签: c# silverlight com resources

我的托管应用程序通过托管包装器消耗本机COM dll公开的旧版功能。我无法更改COM dll及其托管包装。

  • 在给定COM类型声明作为输入的情况下,托管包装器本质上是由脚本自动生成的。
  • COM层将在内部访问网络,文件系统,图形和其他非托管资源。
  • 包装器中的大多数托管类型都是使用类似工厂的方法创建的。
  • 包装器中的大多数托管类型无法手动触发清理或资源释放。
  • 包装器中没有托管类型实现IDisposable。
  • 包装器中没有托管类型显式实现终结器。

我觉得我在我的应用程序层中错过了很多我希望看到的API,以确保正确释放非托管资源。

问题是我是否理解这一点:

  

鉴于应用程序层不再引用托管包装器中的对象,该托管对象使用的基础本机对象无法被释放,直到暴露的清理方法明确地这样做

我是否正确?

1 个答案:

答案 0 :(得分:1)

不,这不太正确。当垃圾收集器收集引用COM类型的托管类型时,将使用COM Release调用取消引用这些引用。在这一点上,假设没有其他东西引用COM对象实例,将释放非托管资源。

然而,除非你打电话给GC.Collect()(这是一件相当严苛的事情),否则这些非托管资源可能会被保留很长时间,远远超过必要的时间。