C#:无法捕获非托管代码中的异常,即使使用legacyCorruptedStateExceptionsPolicy和HandleProcessCorruptedStateExceptions

时间:2016-05-23 15:13:23

标签: c# error-handling native unmanaged

我在一些调用非托管dll的C#中出现了令人愤怒的间歇性错误:

[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框架4+中,默认行为是忽略非托管代码中抛出的错误。但是this MSDN article表明使用该属性应该强制捕获异常。

但是,没有记录任何内容,并且该行的断点永远不会被命中。

我也把它放在我的App.Config中:

<runtime>
    <legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>

作为also suggested by MSDN。但似乎没有任何区别。

这很令人担忧,因为在这种情况下,开发人员能够在应用程序的这一部分中记录错误非常重要。无论在这里饲养的实际错误如何,我还能做些什么来确保DLL在我的代码中管理错误?

1 个答案:

答案 0 :(得分:2)

如果对于搜索相同问题并按照您提到的同一篇文章before的任何人仍然有帮助,我正在使用以下属性: [HandleProcessCorruptedStateExceptions] [SecurityCritical]

同样在此MSDN article中,您可以找到以下文字:

  

HandleProcessCorruptedStateExceptionsAttribute属性是   在部分信任或透明中遇到它时被忽略   代码

所以代码的开头看起来像是:

[HandleProcessCorruptedStateExceptions]
[SecurityCritical]
public string GetAddress(int searchHandle)
{
    try
...