如何重新加载经常崩溃的第三方DLL

3

我正在使用一个用未管理的C++编写的第三方DLL来控制我们拥有的一些硬件。

不幸的是,这个DLL偶尔会崩溃,我被指示自动地使其“重新加载”。我不太确定如何进行操作以获得最佳结果。

我的项目使用C++.Net 2.0(2005)。我将第三方内容包装在一个单独的DLL中。我一直在尝试使用FreeLibrary()和LoadLibrary()。然而,当我使用FreeLibrary()时,一些内部DLL依赖项仍然被分配,并且LoadLibrary()将导致由于内存损坏而崩溃。

另一种建议是使用.NET远程接口重构整个项目。这将使杀死另一个进程并重新启动它变得更容易,但需要大量工作。

有什么建议吗?提示?指针?

4个回答

10

最有效的方法是根本不在您的应用程序进程中加载那个DLL。相反,创建一个仅使用该DLL来代表您的应用程序的第二个进程。您可以使用共享内存区域,本地套接字或其他IPC机制来控制代理进程。

这样,当有问题的DLL崩溃时,您只需允许代理进程关闭,而无需担心(几乎不可能)尝试确保该DLL在崩溃时没有破坏任何重要内容的艰巨任务。您的主进程只需要启动代理进程的新实例并继续运行即可。


4
我不是Windows专家,但我认为一般的想法应该是正确的。
LoadLibrary和FreeLibrary用于映射DLL到进程内存空间。你看到的损坏可能是由于DLL内部的某些代码做了一些“坏事”,并且几乎肯定会破坏进程内存。现在如果它崩溃了,几乎肯定会杀死它正在运行的线程-如果不是整个进程。
我会猜测,可靠地恢复并确保非损坏性内存的唯一方法是在流氓DLL周围运行一个牺牲进程作为包装器。我假设远程接口是实现这一点的一种方式。可能还有其他方法。

对于本地代码,你永远不知道它破坏了哪个内存(结构)- 包括CLR自己。 - Christian.K

0

LoadLibrary和FreeLibrary是开始,但是如果您想要在DLL中承受崩溃,那么您需要将所有调用封装到SEH(结构化异常处理)__try / __catch块中。请注意,这与C ++异常和try / catch块非常不同。有关更多信息,请参见MSDN。


0
如果 DLL 本身崩溃,并且贵公司打算继续使用它,那么耗费时间重新创建它可能是值得的。最好修复问题,而不仅仅是临时解决。

除非你打算进行逆向工程,否则这可能是不可行的。对于仅限软件的DLL,这可能是一个合理的建议,但对于驱动程序来说并不实用。 - Draemon
我不能这样做,因为DLL直接与我毫无了解的专有硬件进行接口。此外,还涉及许多非常复杂的数学算法等。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接