如何在完全重启后卸载未使用的 COM objects/libraries?
How to unload unsued COM objects/libraries after a complete restart?
事情是这样的。我正在通过 COM 连接到位于 KNX/EIB 的某些设备。但有时——无论如何我都想为最坏的情况做好准备——我的应用程序崩溃,不知何故,所有对象和库都暴露在某处。我注意到当我重新启动应用程序时,我无法再次建立连接。我收到一个连接过程的错误,但实际上运行正常。有时这个连接过程是随机的,有时它不是。那很不好!一段时间(几分钟)后,它似乎在一系列完全失败后再次工作。但我想我现在看到了一种模式。在没有干净断开的情况下崩溃后它不起作用。我的猜测是有些对象与设备保持连接,这就是我无法获得新连接的原因。这就是我问这个问题的原因。
问题:
- 如何卸载那些未使用的对象以杀死不死连接?
- 如何让 Windows 检查未使用的库是否被卸载?
我只想告诉Windows,"I messed up badly and I need to continue my work. Please clean up my mess for me, so I can start fresh! Do I deserve a 2nd chance?"
编辑:
场景是应用程序崩溃并关闭。我没有任何参考了。没有 finally 条款或任何东西。该应用程序只能重新启动。我该怎么做才能以编程方式清理之前造成的混乱?
编辑 2:
汉斯给了我杀死负责服务器的提示。所以现在我通过在启动时调用 taskkill 来解决这个问题(至少只要我在开发中)。并且有效!
C:\Windows\System32\taskkill.exe /F /IM Falcon.exe
这是进程外 COM 服务器的故障模式。如果客户端程序在没有释放接口指针的情况下崩溃到桌面,那么服务器就完全不知道客户端已经不在了。当您尝试重新连接时往往会变得不稳定,许多服务器只允许一个客户端。
到目前为止,程序员引发这种故障模式的最常见方式是使用调试器。他们将单击红色按钮或使用停止调试命令。 Bam,当然没有清理。
COM 垃圾自动收集未使用的服务器。但这并不是特别快,在它决定需要介入之前只需要 10 分钟。而且并不总是适用于每台服务器,例如众所周知,Office 程序不会被清理。
当您的应用在正常使用中崩溃时,您对此无能为力。否则那种杀死中间件的问题。尽管如此,在 C# 程序中发生这样的事故还是很不寻常的,即使应用程序因异常而崩溃,CLR 也会在程序终止时释放接口指针。您必须遇到非常严重的事故才能绕过这种严重异常,例如 ExecutionEngineException 或以该站点命名的异常。
不要过分关注停止调试引起的故障,这是正常的,使用任务管理器终止服务器是预期和必需的。否则只要确保从您的代码中清除讨厌的错误,您就不会有问题。如果您需要更多帮助,请务必联系服务器的所有者,确保有一个小型的重现项目可以演示该问题。
事情是这样的。我正在通过 COM 连接到位于 KNX/EIB 的某些设备。但有时——无论如何我都想为最坏的情况做好准备——我的应用程序崩溃,不知何故,所有对象和库都暴露在某处。我注意到当我重新启动应用程序时,我无法再次建立连接。我收到一个连接过程的错误,但实际上运行正常。有时这个连接过程是随机的,有时它不是。那很不好!一段时间(几分钟)后,它似乎在一系列完全失败后再次工作。但我想我现在看到了一种模式。在没有干净断开的情况下崩溃后它不起作用。我的猜测是有些对象与设备保持连接,这就是我无法获得新连接的原因。这就是我问这个问题的原因。
问题:
- 如何卸载那些未使用的对象以杀死不死连接?
- 如何让 Windows 检查未使用的库是否被卸载?
我只想告诉Windows,"I messed up badly and I need to continue my work. Please clean up my mess for me, so I can start fresh! Do I deserve a 2nd chance?"
编辑:
场景是应用程序崩溃并关闭。我没有任何参考了。没有 finally 条款或任何东西。该应用程序只能重新启动。我该怎么做才能以编程方式清理之前造成的混乱?
编辑 2:
汉斯给了我杀死负责服务器的提示。所以现在我通过在启动时调用 taskkill 来解决这个问题(至少只要我在开发中)。并且有效!
C:\Windows\System32\taskkill.exe /F /IM Falcon.exe
这是进程外 COM 服务器的故障模式。如果客户端程序在没有释放接口指针的情况下崩溃到桌面,那么服务器就完全不知道客户端已经不在了。当您尝试重新连接时往往会变得不稳定,许多服务器只允许一个客户端。
到目前为止,程序员引发这种故障模式的最常见方式是使用调试器。他们将单击红色按钮或使用停止调试命令。 Bam,当然没有清理。
COM 垃圾自动收集未使用的服务器。但这并不是特别快,在它决定需要介入之前只需要 10 分钟。而且并不总是适用于每台服务器,例如众所周知,Office 程序不会被清理。
当您的应用在正常使用中崩溃时,您对此无能为力。否则那种杀死中间件的问题。尽管如此,在 C# 程序中发生这样的事故还是很不寻常的,即使应用程序因异常而崩溃,CLR 也会在程序终止时释放接口指针。您必须遇到非常严重的事故才能绕过这种严重异常,例如 ExecutionEngineException 或以该站点命名的异常。
不要过分关注停止调试引起的故障,这是正常的,使用任务管理器终止服务器是预期和必需的。否则只要确保从您的代码中清除讨厌的错误,您就不会有问题。如果您需要更多帮助,请务必联系服务器的所有者,确保有一个小型的重现项目可以演示该问题。