c# - 完全重启后如何卸载未使用的 COM 对象/库?

标签 c# windows com

事情是这样的。我正在通过 COM 连接到 KNX/EIB 的某些设备。但有时——无论如何我都想为最坏的情况做好准备——我的应用程序崩溃,不知何故,所有对象和库都暴露在某处。我注意到当我重新启动应用程序时,我无法再次建立连接。我收到一个连接过程的错误,但实际上运行正常。有时这个连接过程是随机的,有时它不是。那很不好!一段时间(几分钟)后,它似乎在一系列完全失败后再次工作。但我想我现在看到了一种模式。在没有干净断开的情况下崩溃后它不起作用。我的猜测是有些对象与设备保持连接,这就是我无法获得新连接的原因。这就是我问这个问题的原因。


问题:

  • 如何卸载那些未使用的对象以杀死不死连接?
  • 如何让 Windows 检查要卸载的未使用的库?

我只想告诉 Windows,“我搞砸了,我需要继续我的工作。请帮我清理一下我的烂摊子,这样我就可以重新开始了!我值得第二次机会吗?”

编辑:
场景是应用程序崩溃并关闭。我没有任何引用了。没有 finally 条款或任何东西。该应用程序只能重新启动。我该怎么做才能以编程方式清理之前造成的困惑?

编辑 2:
汉斯给了我杀死负责服务器的提示。所以现在我通过在启动时调用 taskkill 来解决这个问题(至少只要我在开发中)。并且有效!

C:\Windows\System32\taskkill.exe /F /IM Falcon.exe

最佳答案

这是进程外 COM 服务器的故障模式。如果客户端程序在没有释放接口(interface)指针的情况下崩溃到桌面,那么服务器就完全不知道客户端已经不在了。当您尝试重新连接时往往会变得不稳定,许多服务器只允许一个客户端。

到目前为止,程序员引发这种故障模式的最常见方式是使用调试器。他们将单击红色按钮或使用停止调试命令。 Bam,当然没有清理。

COM 垃圾收集自动未使用的服务器。但这并不是特别快,在它决定需要介入之前只需要轻松 10 分钟。而且并不总是适用于每台服务器,例如众所周知,Office 程序不会得到清理。

当您的应用在正常使用中崩溃时,您对此无能为力。否则那种杀死中间件的问题。尽管如此,在 C# 程序中发生这样的事故还是很不寻常的,即使应用程序因异常而崩溃,CLR 也会在程序终止时释放接口(interface)指针。您必须遇到非常严重的事故才能绕过这种严重异常,例如 ExecutionEngineException 或此站点以其命名的异常。

不要过分关注停止调试引起的故障,这是正常的,使用任务管理器终止服务器是预期和必需的。否则只要确保从您的代码中清除讨厌的错误,您就不会有问题。如果您需要更多帮助,请务必联系服务器的所有者,确保有一个小型的重现项目可以演示该问题。

关于c# - 完全重启后如何卸载未使用的 COM 对象/库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29390734/

相关文章:

c# - 我什么时候可以在 native foreach 循环上使用 List<T>.ForEach?

c# - 复杂对象的元数据类型

java - 更改 Java 安全级别

windows - 如何以编程方式检测操作系统何时完成加载其所有应用程序\服务?

c# - 从数据集中检索列的值时出错

c# - Expression-Bodied Function 与 Auto Properties 结合会导致问题

c - 错误 MSB3073 : The command "staticdv.exe/devenv/check" exited with code -1

windows - 如何为每个 Windows 操作系统和我的应用程序拆分 RAM?

c++ - VBA COM 互操作问题

com - Outlook Interop 复制邮件项目