gpt4 book ai didi

silverlight - 如何在 Silverlight 4 中释放 COM 对象

转载 作者:行者123 更新时间:2023-12-04 03:14:15 24 4
gpt4 key购买 nike

将 COM 互操作与 Office(通常是 Excel)一起使用时,我总是小心确保我调用 Marshal.ReleaseComObject在每个引用上,以避免 Excel 不退出的问题 as described in this KB article .

当我从 OOB Silverlight 应用程序(使用 AutomationFactory.CreateObject)使用 Interop 时,如何确保 Excel 退出?

Silverlight 没有 Marshal.ReleaseComObject方法甚至调用 GC.CollectGC.WaitForPendingFinalizers没有帮助。

如果没有释放 COM 引用的机制,微软肯定没有将此功能添加到 Silverlight 吗?在我看来,这似乎是自动化进程外 COM 服务器(如 Excel)的最佳选择。

一个令人惊讶的遗漏,更何况 Pete Brown 在他的书“Silverlight 4 in Action”的第 5.5 节中谈到 AutomationFactory.CreateObject , 那:

The primary intent of this feature is to allow automation of other applications, including Microsoft Office.



更新 回应汉斯的评论。

我不相信 Office 应用程序的典型自动化中存在“无声刺客”问题。一个常见的用法可能类似于以下内容,我在 WinForms 应用程序中反复使用过,但从未遇到 Hans 链接的文章中描述的“中毒 RCW”:
  • 创建 Excel.Application 实例
  • 打开或创建工作簿
  • 将数据写入工作簿
  • 如果一切顺利,则显示 Excel,关闭工作簿并调用 Application.Quit 如果没有。
  • 调用 Marshal.ReleaseComObject 释放所有 Excel 对象引用。

  • 未能按照 Hans 的建议调用 Marshal.ReleaseComObject 将使 Excel.exe 的多个副本运行,如上面提到的知识库文章中所述 - 非常不受欢迎。

    更新 2

    我用来重现此内容的示例是来自 Pete Brown 的书 Silverlight 4 in action 的源代码示例,此页面上有下载链接。示例解决方案 AutomatingExcel 位于 Ch05.zip/5.03 中。重现:
  • 确保没有 Excel 实例正在运行
  • 运行 AutomatingExcel 示例
  • 打开 Excel 工作簿
  • 关闭 Excel
  • 使用任务管理器观察 Excel 仍在运行。

  • 将所有动态变量设置为 null 并调用 GC.Collect() 似乎可以正常工作,正如 AnthonyWJones 的回答中所指出的那样。

    更新 2

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

    对必须处理哪些内容以确保发布所有 Excel 引用有一个权威的看法会很有趣。

    最佳答案

    您可以实现 IDisposable界面。我见过的最好的例子是 http://csfun.blog49.fc2.com/blog-entry-79.html .博客条目是日文的,但如果您不会阅读日文,请在 Chrome 中打开并让 Google 为您进行页面翻译。

    此外,如果您只想直接获取 COM 包装器的源代码示例,您可以下载它附带的示例应用程序:SilverOffice .

    关于silverlight - 如何在 Silverlight 4 中释放 COM 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605024/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com