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

时间:2008-12-10 22:53:52

标签: .net c++ winapi dll

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

不幸的是,这个DLL偶尔会崩溃,我的任务是让它自动“重新加载”。我不太确定如何获得最佳效果。

我的项目使用C ++。Net 2.0(2005)。我将第三方的东西包装在一个单独的DLL中。我一直在尝试FreeLibrary()和LoadLibrary()。但是,当我使用FreeLibrary()时,仍会分配一些内部DLL依赖项,而LoadLibrary()会因内存损坏而导致崩溃。

建议的另一种方法是使用.NET远程接口重构整个项目。它会更容易杀死另一个进程并重新启动它,但这将是很多工作。

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

4 个答案:

答案 0 :(得分:10)

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

这样,当有问题的DLL崩溃时,你可以简单地让代理进程死掉,而不用担心尝试确保DLL没有损坏任何重要的东西(几乎不可能)。您的主要流程只需要启动代理流程的新实例并继续。

答案 1 :(得分:4)

我不是Windows专家,但我认为一般的想法应该成立。

LoadLibrary,FreeLibrary处理将DLL映射到进程内存空间。您所看到的腐败可能是由于DLL中的某些代码执行“坏”并且几乎​​肯定会破坏进程内存。现在如果它崩溃了,它几乎肯定会杀死它运行的线程 - 如果不是整个过程。

我会采取有根据的猜测,可靠恢复并确保内存不受损坏的唯一方法是运行牺牲过程作为流氓DLL的包装器。我假设远程接口是这样做的一种方式。可能还有其他人。

答案 2 :(得分:0)

LoadLibrary和FreeLibrary是开始,但是如果您希望能够在DLL中克服崩溃,则需要将所有调用包装在SEH(结构化异常处理)__try / __catch块中的DLL中。注:这与C ++异常和try / catch块完全不同。有关详细信息,请参阅MSDN。

答案 3 :(得分:0)

如果DLL本身崩溃并且您的公司会采用它,那么可能值得花时间重新创建它。更好地解决问题,而不是仅限制它。