silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在Silverlight 4中释放COM对象大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

使用COR_552_11845@ Interop with Office(通常是Excel)时,我总是小心翼翼地确保我在每个引用上调用Marshal.ReleaseComObject,以避免Excel不退出 as described in this KB article的问题. 当我从OOB Silverlight应用程序(使用AutomationFactory.CreateObject)使用Interop时,如何确
使用COR_552_11845@ Interop with Office(通常是Excel)时,我总是小心翼翼地确保我在每个引用上@L_504_0@marshal.ReleaseComObject,以避免Excel不退出 as described in this KB article的问题.

当我从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:

更新以回应汉斯的评论.

我不相信Office应用程序的典型自动化中存在“无声刺客”问题.一个常见的用法可能看起来像下面这样,我已经看到在WinForms应用程序中反复使用,而没有遇到由Hans链接文章中描述的“中毒的RCW”:

>创建Excel.Application实例
>打开或创建工作簿
>将数据写入工作簿
>如果一切顺利,则显示Excel,关闭工作簿并调用Application.Quit,如果没有.
>@L_504_0@marshal.ReleaseComObject以释放所有Excel对象引用.

未按照Hans的建议@L_504_0@marshal.ReleaseComObject将使Excel.exe的多个副本运行,如上面提到的知识库文章中所述 – 非常不受欢迎.

更新2

我用来重现的样本是Pete Brown的书Silverlight 4的源代码示例,该页面上有一个下载链接.示例解决方案AutomaTingExcel位于Ch05.zip / 5.03中.重申:

>确保没有正在运行的Excel实例
>运行AutomaTingExcel示例
>打开Excel工作簿
>关闭Excel
>使用任务管理器观察Excel仍在运行.

将所有动态变量设置为null并调用GC.Collect()似乎在AnthonyWJones的答案中指出.

更新2

Otaku的答案正是我所寻找的 – 通过在using语句中包装引用,COM引用被释放而无需调用GC.Collect.一些实验表明,与上面引用的知识库文章中描述的标准Marshal.ReleaseComObject解决方案不同,它更能容忍未能处理每一个引用.

有必要对确保所有Excel引用都已发布的必须处理的内容进行权威性处理会很有趣.

解决方法

您可以实现IDisposable接口.我见过的最好的例子是 http://csfun.blog49.fc2.com/blog-entry-79.html.博客条目是日语,但在Chrome中打开,如果你不读日语,谷歌会为你翻页.

此外,如果您只想直接使用COR_552_11845@包装器的源代码示例,则可以下载它所带来的示例应用程序:SilverOffice.

大佬总结

以上是大佬教程为你收集整理的如何在Silverlight 4中释放COM对象全部内容,希望文章能够帮你解决如何在Silverlight 4中释放COM对象所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。