C# 为什么try/catch块中的一行代码仍然会导致整个应用程序崩溃?

C# 为什么try/catch块中的一行代码仍然会导致整个应用程序崩溃?,c#,.net,exception-handling,compact-framework,C#,.net,Exception Handling,Compact Framework,我已经为此争论了几个小时,可能只是我不理解引用程序集 我有一个运行在WindowsCE4.2/5.0上的.NETCF1.0应用程序 有一个托管程序集,它是作为项目参考添加的设备SDK的一部分 大多数时候,一切都很顺利。我可以调用这些方法并成功修改设备的状态(例如设置键盘状态或调暗背光) 在某些设备上,当我的应用程序遇到引用DLL的代码时,它自己就会崩溃 我的问题是我无法从中恢复过来。代码完全包含在捕获一般异常的try/catch中: try { if

我已经为此争论了几个小时,可能只是我不理解引用程序集

我有一个运行在WindowsCE4.2/5.0上的.NETCF1.0应用程序

有一个托管程序集,它是作为项目参考添加的设备SDK的一部分

大多数时候,一切都很顺利。我可以调用这些方法并成功修改设备的状态(例如设置键盘状态或调暗背光)

在某些设备上,当我的应用程序遇到引用DLL的代码时,它自己就会崩溃

我的问题是我无法从中恢复过来。代码完全包含在捕获一般异常的try/catch中:

try
{                   
    if (Terminal.API.UnitAPI.KbdGetKeyInputState() == 
                         (int)Terminal.API.KbdState.AlphaOn)
     Terminal.API.UnitAPI.KbdSetKeyInputState
                          (Terminal.API.KbdState.AlphaDown);
}
catch (Exception e) 
{
    log("Error loading DLL: " + e.Message);
} 

如果有人对如何正确恢复有任何想法,我将不胜感激。谢谢。

你可能想看看我刚才提到的这个。我的问题的根源在于抛出的异常不是从System.exception继承的,因此它没有被捕获。

您可能想看看我不久前提出的这个问题。我的问题的根源是抛出的异常没有继承自System.exception,因此它没有被捕获。

如果程序集A引用了另一个程序集B,那么B实际上不会加载,直到引用程序集B中某个内容的第一个方法被JIT。如果程序集B不可用,JIT编译方法时会发生运行时崩溃,而不是执行调用时。无法可靠地捕获此异常,因为它实际上不是异常


如果此引用的程序集在某些平台上不可用,则应改为通过反射加载它。此机制将引发您可以捕获的异常。

如果您的程序集A引用了另一个程序集B,则B实际上不会加载,直到引用程序集B中某个内容的第一个方法被JIT。如果程序集B不可用,JIT编译您的方法时将发生运行时崩溃,执行调用时不执行该操作。无法可靠地捕获此异常,因为它实际上不是异常


如果此引用的程序集在某些平台上不可用,则应改为通过反射加载它。此机制将引发您可以捕获的异常。

无法处理本机API中发生的异常。这是很自然的行为,因为try-catch块仅解释托管异常。

无法处理本机API中发生的异常。这是很自然的行为,因为try-catch块只解释托管异常。

非托管函数声明中的错误、使用非托管函数的错误或非托管代码中的bug/hacks/workarounds可能会破坏进程内存,导致AccessViolationException、ExecutionEngineeException和崩溃,根据内存中的损坏位置,它可以在不同的机器和应用程序状态之间更改

即使以前调用的非托管函数破坏了进程内存并在没有任何上述症状的情况下成功完成,代码中的特定位置也可能导致所有这些症状

首先,验证非托管函数声明,尤其是int/uint/IntPtr字段。
第二,验证是否发送了预期值和分配了足够内存的未释放指针(IntPtr)。

非托管函数声明中的错误、使用非托管函数中的错误或非托管代码中的bug/hacks/workarounds可能会破坏进程内存,导致AccessViolationException,ExecutionEngineeException和Crash,取决于内存中的损坏位置,它可以在不同的机器和应用程序状态之间更改

即使以前调用的非托管函数破坏了进程内存并在没有任何上述症状的情况下成功完成,代码中的特定位置也可能导致所有这些症状

首先,验证非托管函数声明,尤其是int/uint/IntPtr字段。
其次,验证您是否发送了预期值和未释放指针(IntPtr),并为它们分配了足够的内存。

是否引发了特定的异常?有些无法被捕获。您调用的方法是否在单独的线程中运行?@David,exception类不应该捕获任何异常吗?@KBoek:有些异常无法被捕获。我想到了StackOverFlowException、OutOfMemoryException和ExecutionEngineException。(我在一篇老博文中提到了这些,其中讨论了
最终
块不会被执行的情况:)@KBoek:不,它在主线程中运行@大卫:这是一个MissingMethodException。是否引发了特定的异常?有些无法被捕获。您调用的方法是否在单独的线程中运行?@David,exception类不应该捕获任何异常吗?@KBoek:有些异常无法被捕获。我想到了StackOverFlowException、OutOfMemoryException和ExecutionEngineException。(我在一篇老博文中提到了这些,其中讨论了
最终
块不会被执行的情况:)@KBoek:不,它在主线程中运行@大卫:这是一个MissingMethodException。MissingMethodException是抛出的,它是从System.Exception继承的。我试图专门捕获它,但仍然失败。MissingMethodException是抛出的,它是从System.Exception继承的。我试图抓住它,但还是失败了。