【发布时间】:2010-05-31 15:49:34
【问题描述】:
我正在尝试实现一个单例类,其中包含一个 com 对象。类实现了 IDisposable 接口,但是当我尝试实现终结方法时,我得到了从另一个线程访问 com 对象的异常。
这是因为 clr 在终结对象时使用了不同的线程。
有没有办法实现这样的事情,或者我只是做错了什么?
【问题讨论】:
我正在尝试实现一个单例类,其中包含一个 com 对象。类实现了 IDisposable 接口,但是当我尝试实现终结方法时,我得到了从另一个线程访问 com 对象的异常。
这是因为 clr 在终结对象时使用了不同的线程。
有没有办法实现这样的事情,或者我只是做错了什么?
【问题讨论】:
如果类直接管理非托管资源,您只需要实现终结器。 COM 对象被包装在 RCW(运行时可调用包装器)中,因此在您的类型和 COM 接口指针之间已经存在托管类型。
【讨论】:
Dispose 实现中使用 Marshall 帮助程序显式释放。实际上,Office 应用程序并不总是在它们应该消失的时候消失(我在纯 COM 案例中遇到过这个问题,这是 Office 自动化的问题)。