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

时间:2015-04-01 12:22:04

标签: c# windows com

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

<小时/> 的问题:

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

我只想告诉Windows,&#34;我搞砸了,我需要继续工作。请为我清理我的烂摊子,这样我才能重新开始!我应该获得第二次机会吗?&#34;

修改
该方案是应用程序已崩溃并关闭。我不再提及任何东西了。没有最终条款或任何东西。该应用只能重新启动。我能做些什么来清理以前编程的混乱?

编辑2:
汉斯给了我一些杀死责任服务器的暗示。所以现在我通过在启动时调用taskkill来解决这个问题(至少在开发时我是这么久)。它有效!

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

1 个答案:

答案 0 :(得分:2)

这是进程外COM服务器的故障模式。如果客户端程序在没有释放接口指针的情况下崩溃到桌面,则服务器完全不知道客户端不再存在。当你尝试重新连接时,往往会变得很笨拙,许多服务器只允许一个客户端。

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

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

当您的应用经常使用时,您无法做到这一点。否则那种杀死中间件的问题。尽管如此,在C#程序中发生这样的事故是非常不寻常的,即使应用程序因异常而崩溃,CLR也会在程序终止时释放接口指针。你必须有一个非常讨厌的事故来绕过这个,像ExecutionEngineException这样的关键异常或这个网站命名的异常。

不要过分关注Stop Debugging引发的故障,这是正常的,并且使用任务管理器来终止服务器是预期和需要的。否则,请务必从代码中获取令人讨厌的错误,否则您将无法解决问题。如果您需要更多帮助,请务必联系服务器的所有者,确保有一个可用于演示此问题的小型repro项目。