Я прочитал книгу Джеффри Рихтера «CLR через C #». В главе 20 приведен пример кода, демонстрирующий использование областей ограниченного выполнения (CER):
private static void Demo2() {
// Force the code in the finally to be eagerly prepared
RuntimeHelpers.PrepareConstrainedRegions(); // System.Runtime.CompilerServices namespace
try {
Console.WriteLine("In try");
}
finally {
// Type2’s static constructor is implicitly called in here
Type2.M();
}
}
public class Type2 {
static Type2() {
Console.WriteLine("Type2's static ctor called");
}
// Use this attribute defined in the System.Runtime.ConstrainedExecution namespace
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static void M() { }
}
И следующий текст:
Теперь, когда я запускаю эту версию кода, я получаю следующий результат.
Type2's static ctor called In try
Но когда я запускаю этот код, я получаю следующий результат независимо от того, использую я CER или нет:
In try
Type2's static ctor called
Итак, конструктор Type2
вызывается после try
блока (что нарушает смысл использования CER, насколько я понимаю).
Что может быть причиной этого?
РЕДАКТИРОВАТЬ: Я использую .Net Core 3.1 и VS Enterprise 2019 Preview Version 16.6.0 Preview 3.0, мой код:
using System;
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
public sealed class Program
{
public static void Main()
{
Demo2();
}
private static void Demo2()
{
RuntimeHelpers.PrepareConstrainedRegions();
try
{
Console.WriteLine("In try");
}
finally
{
Type2.M();
}
}
}
public class Type2
{
static Type2()
{
Console.WriteLine("Type2's static ctor called");
}
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static void M() { }
}
Кстати, класс Type2
может находиться внутри Program
, это не меняет вывод.
using
. Вы можете указать, какую версию .NET вы используете. - person Christian.K   schedule 12.06.2020