Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确清理C中的互操作对象#_C#_Excel_Interop_Garbage Collection_Com Interop - Fatal编程技术网

C# 如何正确清理C中的互操作对象#

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对象本质上是非托管代码——一旦您开始从托管应用程序调用非托管代码,您就有责任清理该非托管代码 简而言之,上面文

这是我的后续问题

问题在于,在Excel命名空间中使用链接调用(例如ExcelObject.Foo.Bar())可以防止COM对象的垃圾收集。相反,应该显式地创建对所使用的每个COM对象的引用,并使用Marhsal.ReleaseComObject()显式地释放它们


链式调用后不释放COM对象的行为是否仅限于Excel COM对象?每当COM对象被使用时,应用这种模式是否过火了

COM对象本质上是非托管代码——一旦您开始从托管应用程序调用非托管代码,您就有责任清理该非托管代码


简而言之,上面文章中链接的模式对于所有COM对象都是必需的。

在处理Office应用程序时,正确处理发布肯定比许多其他COM库更重要,原因有二

  • Office应用程序作为进程外服务器运行,而不是在进程库中运行。如果未能正确清理,则会使进程保持运行状态
  • Office应用程序(尤其是Excel IIRC)即使调用Application.Quit,也不会正确终止,如果存在对其COM对象的未完成引用
  • 对于常规的proc-COM库,未能正确清理的后果并不那么严重。当您的进程退出时,所有进程库都随之消失。如果您忘记在不再需要某个对象时调用该对象的ReleaseComObject,那么最终当该对象最终确定时,它仍然会得到处理


    也就是说,这不是写草率代码的借口。

    …对于“必需”的某些定义。在进程关闭时(或者应用程序域卸载,如果先发生的话),我相信所有尚未销毁的RCW(运行时可调用包装器)都会被释放。不幸的是,没有强有力的保证能够正确地销毁它们并执行它们的所有终结器。除此之外,如果销毁COM对象的时间超过2秒,CLR将终止该线程上正在执行的终结器的整个队列。@鲁本,请阅读问题,所问问题的答案是100%正确,然而,关于COM的大量内在细节与这个问题无关。非常好的一点是:为什么必须清理office互操作对象