我现在已经和它斗争了几个小时了,可能只是因为我不理解参考组件以及我应该这样做。
我有一个在Windows CE 4.2 / 5.0上运行的.NET CF 1.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);
}
如果有人对如何从中正确恢复有任何想法,我将不胜感激。感谢。
答案 0 :(得分:2)
如果程序集A引用另一个程序集B,那么在第一个方法是JITed引用程序集B中的内容之前,实际上并不加载B.如果程序集B不可用,则在JIT编译时将发生运行时崩溃你的方法,不是在执行电话时 。此异常无法被可靠地捕获,因为实际上并不是异常。
如果在某些平台上可能无法使用此引用的程序集,则应通过反射加载它。这个机制会引发一个你可以捕获的异常。
答案 1 :(得分:2)
无法处理本机API中发生的异常。这是自然行为,因为try catch块仅解释托管异常。
答案 2 :(得分:0)
您可能想看一下我提出的这个question。我的问题的根源是抛出的异常没有从System.Exception继承,所以它没有被捕获。
答案 3 :(得分:0)
非托管函数声明中的错误,在非托管代码中使用非托管函数或错误/黑客/变通办法可能会破坏进程内存,导致AccessViolationException,ExecutionEngineException和崩溃,具体取决于内存中已损坏的位置,它可以在各种机器和应用程序状态之间切换。
代码中的特定位置可能会导致所有这些症状,即使先前调用的非托管函数已破坏进程内存并成功完成而没有任何上述症状。
首先,验证非托管函数声明,尤其是int / uint / IntPtr字段。 其次,验证您是否发送了期望值和未释放的指针(IntPtr),并为其分配了足够的内存。