Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 捕获DLL崩溃_C#_C# 4.0 - Fatal编程技术网

C# 捕获DLL崩溃

C# 捕获DLL崩溃,c#,c#-4.0,C#,C# 4.0,我有一个使用DLL进行API调用的应用程序。有没有办法防止我的应用程序在DLL崩溃时崩溃?我试着在每个调用周围放置一个try/catch,但这不起作用。崩溃的不是DLL,而是您的线程遭受了心脏病发作。它不能继续,这通常意味着你的过程也完成了。尝试处理异常很少是可能的,您不知道造成了什么样的损害 在单独的进程中运行它是唯一合理的解决方法。尽管试图从突然死亡的进程中恢复是不合理的困难。有些情况总是会导致进程退出,例如,触摸保护页,未能提交任何进程上的保留堆栈页(没有空间放置堆栈)以及其他一些情况。如

我有一个使用DLL进行API调用的应用程序。有没有办法防止我的应用程序在DLL崩溃时崩溃?我试着在每个调用周围放置一个try/catch,但这不起作用。

崩溃的不是DLL,而是您的线程遭受了心脏病发作。它不能继续,这通常意味着你的过程也完成了。尝试处理异常很少是可能的,您不知道造成了什么样的损害


在单独的进程中运行它是唯一合理的解决方法。尽管试图从突然死亡的进程中恢复是不合理的困难。

有些情况总是会导致进程退出,例如,触摸保护页,未能提交任何进程上的保留堆栈页(没有空间放置堆栈)以及其他一些情况。如果您想保护您的进程不受DLL引起的崩溃的影响,您必须从不同的代理进程调用DLL。启动一个仅作为DLL调用主机的虚拟进程,然后使用IPC方式(共享内存、网络管道等)与该进程通信。如果进程崩溃,您将有办法检测它并相应地继续。这比try/catch要复杂得多,但在C#中是完全可行的。请理解,您需要一个单独的应用程序作为崩溃测试虚拟进程。

如果DLL是第三方库,您无法修改,则可以在中加载和执行代码

如果是您自己的代码,最好先修复bug。
NullReferenceException
几乎总是表示代码中存在应该修复的错误


由于您无法通过try/catch博客捕获异常,我假设异常发生在另一个线程上。在try/catch块中的另一个线程上包装该方法,或者使用事件来捕获它。

如果不引用DLL,而是动态创建域并将DLL加载到其中,则可以保护应用程序。这并不容易,我发现DLL在以这种方式运行时不会执行它们自己的一些方法,但如果您能够做到这一点,它将保护您的应用程序。然而,这种努力可能并不值得。另一种方法可能是在调用方法之前尝试检测导致DLL错误的条件。

DLL如何“崩溃”?抛出异常?堆栈溢出?空指针引用?DLL是托管代码还是非托管代码?并非所有异常都可以捕获。嘟嘟嘟嘟!(难道没有人会想到孩子!)DLL是托管代码,异常通常是空指针引用或字典键错误。很麻烦。这里有重要的帮助:@Hans Passant:读得好,谢谢。澄清一下:我的意思是只有在dll无法修改时才使用AppDomain方法。