为什么访问冲突异常不能被 捕获.NET4.0.

Why AccessViolationException cannot be caught by .NET4.0

本文关键字:捕获 NET4 不能 访问冲突 异常 为什么      更新时间:2023-10-16
以下

C# 代码将在 上崩溃,这真的很有趣。NET4.0 但在 .NET2.0.

C# 代码

class Program
{
    static void Main(string[] args)
    {
        try
        {
            ExceptionTest();
            Console.WriteLine("Done!");
        }
        catch (Exception e)
        {
            Console.WriteLine("Error !!!");
            Console.WriteLine(e.Message);
        }
    }
    [DllImport("badapp")]
    private static extern int ExceptionTest();
}

C++代码

extern "C" __declspec(dllexport) int ExceptionTest()
{
    IUnknown* pUnk = NULL;
    pUnk->AddRef();
    return 0;
}

如果针对 编译上述 C# 代码。NET2.0,一切正常。仅针对 .NET4.0 将使它在运行时崩溃。

我怀疑系统异常捕获机制已更改。NET4.0. 有什么想法吗?

是的,它在 .NET 4 中发生了变化。无法捕获指示损坏状态的异常。这是因为几乎无法保证在引发损坏状态异常时可以执行任何操作。实际上没有理由希望状态损坏的进程继续执行。

为了与旧代码兼容,可以通过将 legacyCorruptedStateExceptionsPolicy 元素添加到 app.config 来更改此行为。

还可以通过标记要捕获这些异常的方法,方法是使用 HandleProcessCorruptedStateExceptions 属性标记要捕获这些异常的方法,从而逐个执行此操作。

    [HandleProcessCorruptedStateExceptions]
    public static unsafe int LenghtPoint(this IntPtr point)
    {
        //por optimizar
        byte* bytePoint = (byte*)point.ToPointer();
        byte auxByte;
        int length = 1;
        bool encontrado = false;
        while (!encontrado)
        {
            try
            {
                auxByte = bytePoint[length];
                length++;
            }
            catch (System.AccessViolationException)
            {
                length--;
                encontrado = true;
            }
        }
        return length;
    }