C# 如何正确清理C中的互操作对象#
这是我的后续问题 问题在于,在Excel命名空间中使用链接调用(例如ExcelObject.Foo.Bar())可以防止COM对象的垃圾收集。相反,应该显式地创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式地释放它们C# 如何正确清理C中的互操作对象#,c#,excel,interop,garbage-collection,com-interop,C#,Excel,Interop,Garbage Collection,Com Interop,这是我的后续问题 问题在于,在Excel命名空间中使用链接调用(例如ExcelObject.Foo.Bar())可以防止COM对象的垃圾收集。相反,应该显式地创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式地释放它们 链式调用后不释放COM对象的行为是否仅限于Excel COM对象?每当COM对象被使用时,应用这种模式是否过火了 COM对象本质上是非托管代码——一旦您开始从托管应用程序调用非托管代码,您就有责任清理该非托管代码 简而言之,上面文
链式调用后不释放COM对象的行为是否仅限于Excel COM对象?每当COM对象被使用时,应用这种模式是否过火了 COM对象本质上是非托管代码——一旦您开始从托管应用程序调用非托管代码,您就有责任清理该非托管代码
简而言之,上面文章中链接的模式对于所有COM对象都是必需的。在处理Office应用程序时,正确处理发布肯定比许多其他COM库更重要,原因有二
也就是说,这不是写草率代码的借口。…对于“必需”的某些定义。在进程关闭时(或者应用程序域卸载,如果先发生的话),我相信所有尚未销毁的RCW(运行时可调用包装器)都会被释放。不幸的是,没有强有力的保证能够正确地销毁它们并执行它们的所有终结器。除此之外,如果销毁COM对象的时间超过2秒,CLR将终止该线程上正在执行的终结器的整个队列。@鲁本,请阅读问题,所问问题的答案是100%正确,然而,关于COM的大量内在细节与这个问题无关。非常好的一点是:为什么必须清理office互操作对象