我正在研究一个应用程序,它使用一堆外部DLL来建立到某个服务器的连接。奇怪的是,这些DLL的公开方法允许连接,但不能断开或关闭。这些库工作正常,除非你在一个块中对服务器进行大量后续调用,所以我决定要在X次调用之后断开连接并重新连接。销毁C中的非托管对象#
然而,这里存在这个问题。由于没有断开连接方法,我无法断开连接。所以我的问题是,我该如何完全杀死这个非托管对象,以便我可以重新创建它?
我正在研究一个应用程序,它使用一堆外部DLL来建立到某个服务器的连接。奇怪的是,这些DLL的公开方法允许连接,但不能断开或关闭。这些库工作正常,除非你在一个块中对服务器进行大量后续调用,所以我决定要在X次调用之后断开连接并重新连接。销毁C中的非托管对象#
然而,这里存在这个问题。由于没有断开连接方法,我无法断开连接。所以我的问题是,我该如何完全杀死这个非托管对象,以便我可以重新创建它?
我能找到的最佳解决方案是在每个调用外部DLL的线程中运行,最终在线程结束时终止。这是唯一可行的解决方案,因为我无法访问更新的DLL。
如果您在C#中使用非托管资源,您应该让您的类使用并与非托管资源进行交互,实现IDisposable
并使用using
块创建和销毁它们。
如果您无法断开连接,具体取决于您正在进行的接口连接,有时将包含非托管资源的变量设置为空将清除其中的一部分。实际上,如果没有正确的断开/处理方法,没有什么可以做的。
当我读到这个问题时,他不能编写任何有意义的Dispose代码,因为本机库有一个破坏的API。所以我认为这不会有帮助。 – CodesInChaos 2012-08-09 11:58:49
@CodesInChaos确实,我只是在编辑它。 – 2012-08-09 12:02:20
'使用'并不一定意味着处置时,内存将被释放。当垃圾收集器启动时,它将被释放。 – 2012-08-09 12:15:59
您可以手动关闭到服务器的底层连接。我无法再帮助您了解如何在不了解服务(HTTP TCP ect?)的情况下了解更多信息。你可以放一些痕迹(如wireshark)并查看正在传输的内容。
虽然底线是他们的软件坏了。你能否联系供应商?
可悲的是。他们已经从图书馆转移到了基于网络的服务,而且企业还没有能够转移到这种状态(这是一项巨大的转换工作)。 – Simon 2012-08-09 13:11:23
听起来像你的本地库已经坏了,C#没有办法做到这一点。 – CodesInChaos 2012-08-09 11:57:43
垃圾已经提供给您的垃圾库,或者找到不同的垃圾库(同时拿起电话嚷嚷谁制造垃圾)或者推出自己的垃圾箱。 – Alex 2012-08-09 11:59:51
不幸的是,这是一个相当复杂的系统的庞大框架,所以重写不是一种选择 - 是的,图书馆当然不是最好的工作! :) – Simon 2012-08-09 13:09:58