我应该处理一个“哑巴”中的对象吗?本机COM dll上的托管包装器作为非托管资源

本文关键字:本机 dll COM 包装 资源 处理 一个 对象 哑巴 我应该 | 更新日期: 2023-09-27 18:18:31

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

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

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

问题是我对这个的理解是否正确:

如果应用层不再引用托管包装器中的对象,则该托管对象所使用的底层本机对象不可能被释放,直到公开的清理方法显式地释放

我说的对吗?

我应该处理一个“哑巴”中的对象吗?本机COM dll上的托管包装器作为非托管资源

不,这并不完全正确。当垃圾收集器收集引用COM类型的托管类型时,这些引用将使用COM Release调用解引用。此时,非托管资源将被释放,假设没有其他东西引用COM对象实例。

但是,除非您调用GC.Collect()(这是一件相当苛刻的事情),否则这些非托管资源可能被占用的时间远远超过必要的时间。