有趣的是,以下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;
}

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

我怀疑自.NET4.0起系统异常捕获机制已更改。有任何想法吗?

最佳答案

是的,它在.NET 4中已更改。您无法捕获指示损坏状态的异常。这是因为几乎无法保证在引发损坏的状态异常时您可以做任何事情。实际上,没有理由希望状态已损坏的进程继续执行。

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

您还可以根据情况,通过使用HandleProcessCorruptedStateExceptions attribute标记要捕获这些异常的方法来实现此目的。

关于c# - 为什么AccessViolationException无法被.NET4.0捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12581202/

10-11 18:34