我在某些 C# 中遇到了一个令人愤怒的间歇性错误,该错误正在调用非托管 dll:
[DllImport(DLL,SetLastError = true, CharSet = CharSet.Ansi)]
public static extern int Q_GetLine(int SearchHandle, int LineNumber, StringBuilder Buffer, int BufferLength);
[HandleProcessCorruptedStateExceptions]
public string GetAddress(int searchHandle)
{
try
{
StringBuilder addressBuffer = new StringBuilder();
for (int i = 0; i < 5; i++)
{
.Q_GetLine(searchHandle, i, addressBuffer, 2000); // errors here
returnAddress += string.Format("{0},", addressBuffer.ToString());
}
}
catch(Exception ex)
{
_logger.Error(ex, "error in GetAddress");
}
return returnAddress.TrimEnd(',');
}
请注意 HandleProcessCorruptedStateExceptions
属性。我知道在 .net Framework 4+ 中,默认行为是忽略非托管代码中引发的错误。但是,这篇 MSDN 文章建议使用该属性应强制捕获异常。
但是,不会记录任何内容,并且永远不会命中该行处的断点。
我也把它放在我的App.Config中:
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
正如MSDN所建议的那样。但这似乎没有什么区别。
这令人担忧,因为在这种情况下,开发人员能够在应用程序的这一部分中记录错误非常重要。不管这里出现的实际错误是什么,我还能做些什么来确保在我的代码中管理 DLL 引发的错误?
一对搜索相同问题并遵循您在使用属性之前提到的同一篇文章的任何人仍然有帮助:[处理进程损坏状态异常][安全关键]
此外,在此 MSDN 文章中,您可以找到此文本:
属性是 在部分受信任或透明中遇到时忽略 法典
因此,代码的开头如下所示:
[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public string GetAddress(int searchHandle)
{
try
...