相关疑难解决方法(0)

如何正确清理Excel互操作对象?

我在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后,该过程仍然在后台.只有在我的应用程序手动关闭后才会发布.

我做错了什么,或者是否有其他方法可以确保互操作对象得到妥善处理?

c# excel interop com-interop

733
推荐指数
20
解决办法
30万
查看次数

运行时可调用包装器(RCW)范围 - 进程或应用程序域?

在引用非托管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月),我已经给他发了一封电子邮件要求澄清,但是如果其他人必须添加一些东西,请做.

谢谢

.net com interop appdomain marshalling

6
推荐指数
1
解决办法
2735
查看次数

标签 统计

interop ×2

.net ×1

appdomain ×1

c# ×1

com ×1

com-interop ×1

excel ×1

marshalling ×1