在 Microsoft Office 插件中,我们通过事件传递 COM 对象。举一个特定的例子,当 Word 打开一个文档时,我们被调用并传递了一个 Document 对象。那么我们什么时候需要调用 Marshal.ReleaseComObject() 呢?
- 如果我们访问 Document 对象,是否需要对其调用 release?或者我们可以假设 Word 已经访问过它并会清理它吗?
- 如果我们访问给我们一个字符串的 Document.Name。由于字符串不是 COM 对象,我们不需要清理它——对吗?
- 但是,如果我们访问返回包装 COM 对象的类的任何成员(这是由成员方法/函数返回的任何类),我们确实需要调用 release - 对吗?
如果我们错过了发布,会发生什么?我们持有的任何 COM 对象的时间不确定,我们将其包装在一个实现了 IDisposable 的类中。完成后我们调用 Dispose()。但是一些处理这个的代码很复杂,我猜我们偶尔会遇到我们不调用 Dispose 的情况。
我们最好有一个终结器,然后为这些对象的每个实例增加开销(很多!)?还是我们最好使用少量从未发布的 Word COM 对象?
谢谢 - 戴夫