为什么PrepareConstrainedRegions方法在c#中不起作用?

为什么PrepareConstrainedRegions方法在c#中不起作用?,c#,visual-studio,clr,cer,constrained-execution-reg,C#,Visual Studio,Clr,Cer,Constrained Execution Reg,我读了杰弗里·里克特的书《CLR通过C#》。在第20章中,有一个代码示例演示了约束执行区域(CER)的使用: 以及以下案文: 现在,当我运行这个版本的代码时,我得到以下输出 Type2's static ctor called In try 但当我运行此代码时,无论是否使用CER,我都会得到以下输出: In try Type2's static ctor called 因此,Type2constructor在tryblock之后被调用(据我所知,打破了CERs用法的含义) 可能的原因是什么

我读了杰弗里·里克特的书《CLR通过C#》。在第20章中,有一个代码示例演示了约束执行区域(CER)的使用:

以及以下案文:

现在,当我运行这个版本的代码时,我得到以下输出

Type2's static ctor called
In try
但当我运行此代码时,无论是否使用CER,我都会得到以下输出:

In try
Type2's static ctor called
因此,
Type2
constructor在
try
block之后被调用(据我所知,打破了CERs用法的含义)

可能的原因是什么

编辑: 我正在使用.Net Core 3.1和VS Enterprise 2019预览版 版本16.6.0预览版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
类可以在
程序中,它不会更改输出。

(这不是对实际情况的完整回答,但可能会对您有所帮助)

您的问题很可能是在VisualStudio中运行流程(使用CTRL+F5)。然后通过
VsDebugConsole.exe
启动它,然后启动进程(另请参阅)

无论出于何种原因——这需要进行研究——以这种方式运行时,CER似乎不受尊重

要进行验证,您可以尝试直接从命令提示符/控制台运行程序。

(这不是对实际情况的完整回答,但可能会对您有所帮助)

您的问题很可能是在VisualStudio中运行流程(使用CTRL+F5)。然后通过
VsDebugConsole.exe
启动它,然后启动进程(另请参阅)

无论出于何种原因——这需要进行研究——以这种方式运行时,CER似乎不受尊重


要进行验证,您可以尝试直接从命令提示符/控制台运行程序。

以下是Microsoft文章中有关以下内容的引用:

CER仅在.NET Framework中受支持。这篇文章不适用于 .NET核心或.NET 5及以上版本


以下是微软文章中的一段话:

CER仅在.NET Framework中受支持。这篇文章不适用于 .NET核心或.NET 5及以上版本


你能展示一下relavent吗,你调用methodFWIW的地方,它适用于我的(.netfx4.6.2,4.7.2和.netcore3.1)。顺便说一句,你的代码是不可编译的。它缺少使用
指令的
。您可能需要指出您正在使用的.NET版本。我正在使用.NET Core 3.1,正如您所说did@helgez,我在.NET Core3.1、.NET Core3.0、.NET Core2.1、.NET Core2.0、PrepareConstrainedRegions()上测试您的代码,在.NET Core2.2中,出现了其他错误,但在.NET Framework4.7.2、.NET Framework4.6.1、PrepareConstrainedRegions()中工作。我认为这是平台问题。您可以尝试.net framework来测试代码。您是否可以显示调用methodFWIW的relavent,它适用于my(.net Fx 4.6.2、4.7.2和.net Core 3.1)。顺便说一句,你的代码是不可编译的。它缺少使用
指令的
。您可能需要指出您正在使用的.NET版本。我正在使用.NET Core 3.1,正如您所说did@helgez,我在.NET Core3.1、.NET Core3.0、.NET Core2.1、.NET Core2.0、PrepareConstrainedRegions()上测试您的代码,在.NET Core2.2中,出现了其他错误,但在.NET Framework4.7.2、.NET Framework4.6.1、PrepareConstrainedRegions()中工作。我认为这是平台问题。你可以试试.net framework来测试代码。是的,我已经试着用csc.exe来编译我的代码了,它正常工作了。然而,在VS中,我选择“Release”,在不调试的情况下启动应用程序(ctrl+f5),并且(出于某种原因,即使我甚至不能通过断点等进行调试),它只是不显示我的正常行为。我认为在VS中应该有一些其他的设置/选项可以使它(或者其他什么?)工作,但我不知道在哪里可以找到它。P、 从应答到链接帖子的设置没有帮助。是的,我已经尝试用csc.exe编译代码,并且它应该正常工作。然而,在VS中,我选择“Release”,在不调试的情况下启动应用程序(ctrl+f5),并且(出于某种原因,即使我甚至不能通过断点等进行调试),它只是不显示我的正常行为。我认为在VS中应该有一些其他的设置/选项可以使它(或者其他什么?)工作,但我不知道在哪里可以找到它。从答案到链接帖子的PS设置没有帮助。
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() { }
}