我能做些什么来捕获AccessViolationException
异常吗? 它是由一个我无法控制的非托管DLL抛出的。
legacyCorruptedStateExceptionsPolicy=true
添加到app.config中。更多详细信息请参见上面链接的文章。正如其他人指出的那样,您不应该“处理”此条件,但在开发过程中捕获此条件对于疑难解答非常方便。
您可以使用System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions
属性标记您的托管方法:
[HandleProcessCorruptedStateExceptions]
public void MyMethod()
{
try
{
NaughtyCall();
}
catch (AccessViolationException e)
{
// You should really terminate your application here
}
}
是的。
在您的App.config文件中,在<configuration>
标记内放置以下代码:
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
现在您应该能够像处理其他异常一样捕获已损坏的状态异常(CSE)。<legacyCorruptedStateExceptionsPolicy enabled="true"/>
添加到其中即可。app.config
中添加<legacyCorruptedStateExceptionsPolicy enabled="true"/>
”,但没有人说它不应该在默认的<startup>
部分中。感谢您提供<runtime>
部分的提示。 - flor1an首先,我完全同意0xA3的观点。但如果没有其他出路,您可以将脏的非托管dll包装在自己的进程中,并通过IPC(TCP/IP、命名管道等)传输数据。捕获所有异常并通知主进程。这样,您的主进程大多数情况下就可以免受内存损坏。
你可以用try-catch块来包装对非托管DLL的调用。AccessViolationExceptions 可以正常捕获。执行以下代码将显示两条消息:
try
{
throw new AccessViolationException();
}
catch (Exception e)
{
MessageBox.Show(e.Message + e.StackTrace, e.Message, MessageBoxButtons.OK, MessageBoxIcons.Error);
}
MessageBox.Show("Still running..");
legacyCorruptedStateExceptionsPolicy=true
。请参考我的更新。 - Dirk Vollmar