除非应用[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
,否则任何人都可以创建一个会中断的简短示例吗?
我刚刚浏览了这个 sample on MSDN并且无法让它中断,即使我注释掉了 ReliabilityContract 属性。最后似乎总是被调用。
最佳答案
using System;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
class Program {
static bool cerWorked;
static void Main( string[] args ) {
try {
cerWorked = true;
MyFn();
}
catch( OutOfMemoryException ) {
Console.WriteLine( cerWorked );
}
Console.ReadLine();
}
unsafe struct Big {
public fixed byte Bytes[int.MaxValue];
}
//results depends on the existance of this attribute
[ReliabilityContract( Consistency.WillNotCorruptState, Cer.Success )]
unsafe static void StackOverflow() {
Big big;
big.Bytes[ int.MaxValue - 1 ] = 1;
}
static void MyFn() {
RuntimeHelpers.PrepareConstrainedRegions();
try {
cerWorked = false;
}
finally {
StackOverflow();
}
}
}
当 MyFn
被 jitted 时,它会尝试从 finally
block 创建一个 ConstrainedRegion
。
在没有
ReliabilityContract
的情况下,无法形成适当的ConstrainedRegion
,因此会发出常规代码。堆栈溢出异常在调用Stackoverflow
时抛出(在执行 try block 之后)。在
ReliabilityContract
的情况下,可以形成一个ConstrainedRegion
并且finally
block 中方法的堆栈要求可以被提升到MyFn
。调用MyFn
时会抛出堆栈溢出异常(在执行 try block 之前)。
关于c# - 演示受限执行区域重要性的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1101147/