Joe*_*Joe 6 com silverlight interop
当使用COM Interop with Office(通常是Excel)时,我总是小心地确保我调用Marshal.ReleaseComObject每个引用,以避免Excel不退出的问题,如本KB文章中所述.
当我从OOB Silverlight应用程序(带AutomationFactory.CreateObject)使用Interop时,如何确保Excel退出?
Silverlight不有一个Marshal.ReleaseComObject方法,甚至调用GC.Collect并GC.WaitForPendingFinalizers没有帮助.
当然,如果没有释放COM引用的机制,Microsoft有没有将此功能添加到Silverlight中?在我看来,这似乎是自动化进程外COM服务器(如Excel)的一个显示器.
令人惊讶的遗漏,尤其是Pete Brown在他的书"Silverlight 4 in Action"的第5.5节中,甚至可以说AutomationFactory.CreateObject:
此功能的主要目的是允许自动化其他应用程序,包括Microsoft Office.
更新以回应汉斯的评论.
我不相信Office应用程序的典型自动化中存在"无声刺客"问题.一个常见的用法可能看起来像下面这样,我已经看到在WinForms应用程序中反复使用,而没有遇到由Hans链接的文章中描述的"中毒的RCW":
未按照Hans的建议调用Marshal.ReleaseComObject将使Excel.exe的多个副本运行,如上面提到的知识库文章中所述 - 非常不受欢迎.
更新2
我用来重现的样本是Pete Brown的书Silverlight 4的源代码示例,该页面上有一个下载链接.示例解决方案AutomatingExcel位于Ch05.zip/5.03中.重申:
将所有动态变量设置为null并调用GC.Collect()似乎在AnthonyWJones的答案中指出.
更新2
Otaku的答案正是我所寻找的 - 通过在using语句中包装引用,COM引用被释放而无需调用GC.Collect.一些实验表明,与Marshal.ReleaseComObject上面引用的知识库文章中描述的标准解决方案不同,它更能容忍未能处理每一个引用.
有必要对确保所有Excel引用都已发布的必须处理的内容进行权威性处理会很有趣.
您可以实现该IDisposable接口。我见过的最好的例子是http://csfun.blog49.fc2.com/blog-entry-79.html。该博客条目是日语的,但如果您不懂日语,请在 Chrome 中打开并让 Google 为您进行页面翻译。
另外,如果您只想直接获取 COM 包装器的源代码示例,您可以下载它提供的示例应用程序:SilverOffice。
| 归档时间: |
|
| 查看次数: |
2215 次 |
| 最近记录: |