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;
}