我有一个托管对象调用COM服务器来分配一些内存.在托管对象消失之前,托管对象必须再次调用COM服务器以释放该内存,以避免内存泄漏.此对象实现IDisposable以帮助确保正确释放内存的COM调用.
如果没有调用该Dispose方法,我希望对象的终结器释放内存.问题是,最终确定的规则是你不能访问任何引用,因为你不知道在你之前已经GC和/或最终确定了哪些其他对象.这使得唯一可触摸的对象状态为字段(句柄是最常见的).
但是调用COM服务器涉及通过运行时可调用包装器(RCW)来释放我有一个存储在字段中的cookie的内存. 从终结器调用RCW是否安全(是否保证此时没有GC或最终确定)?
对于那些不熟悉终结的人来说,虽然终结器线程在托管应用程序域运行的同时在托管应用程序域的后台运行,但是对于那些触摸引用的情况理论上可以正常,最终化也会在appdomain shutdown和任何顺序中发生 - 不是只是在参考关系顺序.这限制了您可以认为从终结器触摸的安全性.即使引用为非null,对托管对象的任何引用都可能是"坏"(收集的内存).
更新:我刚试了一下,得到了这个:
myassembly.dll中发生未处理的"System.Runtime.InteropServices.InvalidComObjectException"类型异常
附加信息:无法使用已与其基础RCW分离的COM对象.
我正在使用Microsoft.Interropt.Excel DLL编写Excel类.我完成了所有功能,但我的析构函数中有错误.我想将所有更改保存到我的文件中,并且我想要释放所有源代码.我希望所有这些都在我的析构函数中.但在我的析构函数中,Excel.ApplicationClass,Workbook和Worksheet对象由异常填充,其中包含消息"已与其基础RCW分离的COM对象无法使用".所以我不能保存任何东西,什么都不关闭因为ı无法访问工作簿或工作表对象.
我不能在Destructor中访问类私有成员吗?