2015-04-01 53 views
1

这是事情。我通过COM连接到KNX/EIB的一些设备。但有时 - 我想做好准备迎接最糟糕的情况 - 我的应用程序崩溃让所有对象和库暴露在某处,不知何故。我注意到,当我重新启动应用程序,我有麻烦再次获得连接。我得到一个实际上正常工作正常的连接过程的错误。有时候这个连接过程有时并不是随机的。那很不好!经过一段时间(几分钟)后,似乎在一系列完整失败后再次工作。但我认为我现在看到了一种模式。它在崩溃之后不起作用,没有干净的断开连接。我的猜测是有一些对象与设备保持连接,为什么我无法获得新的连接。这就是为什么我问这个问题。 如何在完全重新启动后卸载未使用的COM对象/库?


问:

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

我只是想告诉Windows,“我搞砸了,我需要继续我的工作,请为我清理我的混乱,这样我就可以开始新鲜了,我应该得到第二次机会吗?

编辑:
该场景是该应用程序已崩溃和关闭。我不再提及任何东西。没有最后条款或任何东西。该应用程序只能重新启动。我能做些什么来以编程方式清理之前所做的混乱?

编辑2:
汉斯给了我一个杀死负责任的服务器的暗示。所以现在我在启动时调用taskkill来解决这个问题(至少在我开发的时候)。它的工作原理!

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

你可能需要调用Marshal.ReleaseComObject(在finally块或异常处理程序或其他东西) – 2015-04-01 12:25:34

+0

@MichaelEdenfield我的断开程序充满了。但就像我说的,我想为最坏的情况做好准备。该应用程序崩溃,用户只能重新启动它。 – Bitterblue 2015-04-01 12:42:09

+0

听起来问题出在连接的另一端,无论是出于过程对象还是出现了不容错误的服务。我认为你可以在这里做的最好的是建立你的应用程序来识别这种情况并在启动时处理它 – 2015-04-01 12:51:11

回答

2

这是进程外COM服务器的失败模式。如果客户端程序在不释放接口指针的情况下崩溃到桌面,那么服务器完全不知道客户端已经不在了。当你尝试重新连接时,往往会变得很不自然,许多服务器只允许一个客户端。

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

COM垃圾 - 自动收集未使用的服务器。但这并不是特别快,需要10分钟才能决定是否需要插入。而且并不总是适用于每台服务器,而Office程序出现的问题并不是很清楚。

当您的应用程序在正常使用情况下结束时,您可以做的事情并不多。否则就是那种杀死中间件的问题。尽管如此,在C#程序中发生这样的事情是非常不寻常的,CLR在程序终止时释放接口指针,即使应用程序崩溃时也会发生异常。你必须要避免这种非常令人讨厌的事情,例如ExecutionEngineException或这个站点命名的重要异常。

不要过多关注停止调试引发的故障,这是正常的,并且使用任务管理器来杀死服务器是预期和必需的。否则,只要确保从代码中获得令人讨厌的错误,就不会有问题。如果您需要更多的帮助,请务必联系服务器的所有者,确保有一个小的repro项目可用于演示此问题。

+0

其实我一直在使用taskkill来摆脱Office服务器。也许这不是一个坏主意。我所要做的就是找到服务器,并在启动时摆脱它?我会看看是否有效。当时它帮助我使用Excel。当我的编程无法工作时,当我停止使用两个按键命中的调试应用程序时(当时很方便),我非常恼火。 – Bitterblue 2015-04-01 12:53:42

+0

Taskkill或任务管理器,没关系。在使用GUI的时候,你有更好的可能性。 – 2015-04-01 13:05:26

+0

而“taskkill”起作用。您使用任务管理器的提示帮助我记住了我通过“EXCEL.EXE”做到了这一点。 – Bitterblue 2015-04-01 13:10:39