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