我在C#(ApplicationClass
)中使用Excel互操作,并在我的finally子句中放置了以下代码:
while (System.Runtime.InteropServices.Marshal.ReleaseComObject(excelSheet) != 0) { }
excelSheet = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
虽然这种工作,Excel.exe
即使我关闭Excel后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.
我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?
在引用非托管COM对象时,Runtime Callable Wrapper(RCW)的范围是什么?根据文件:
无论该对象上存在多少引用,运行时都会为每个COM对象创建一个RCW.
如果我不得不"猜测" - 这个解释应该意味着"每个过程一个",但它真的吗?我们非常欢迎任何其他文件.
我的应用程序在自己的应用程序域(它是Outlook插件)中运行,我想知道如果我在循环中使用Marshal.ReleaseComObject(x)直到它的计数达到0(如建议的话)会发生什么.它会从其他插件中释放引用(在同一个Outlook进程中的其他应用程序域中运行)吗?
编辑:完美 - 现在混乱更大.基于2个答案(来自Lette和Ilya),我们有2个不同的答案.官方MSDN文档说每个进程(版本2.0+),但它缺少ver的这句话.1.1的文件.
与此同时,在Mason Bendixen的文章中,它表示它是每个appdomain.
由于他的文章已经过时(2007年4月),我已经给他发了一封电子邮件要求澄清,但是如果其他人必须添加一些东西,请做.
谢谢