SYSLIB0004:不支持受约束的执行区域 (CER) 功能

受约束的执行区域 (CER) 功能仅在 .NET Framework 中受支持。 因此从 .NET 5 开始,与 CER 相关的各种 API 标记为已过时。 使用这些 API 会在编译时生成警告 SYSLIB0004

以下与 CER 相关的 API 已过时:

但是,以下与 CER 相关的 API 未过时:

问题解决

  • 如果已将 CER 属性应用于方法,请删除该属性。 这些属性在 .NET 5 及更高版本中无效。

    // REMOVE the attribute below.
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public void DoSomething()
    {
    }
    
    // REMOVE the attribute below.
    [PrePrepareMethod]
    public void DoSomething()
    {
    }
    
  • 如果调用 RuntimeHelpers.ProbeForSufficientStackRuntimeHelpers.PrepareContractedDelegate,请删除该调用。 这些调用在 .NET 5 及更高版本中无效。

    public void DoSomething()
    {
        // REMOVE the call below.
        RuntimeHelpers.ProbeForSufficientStack();
    
        // (Remainder of your method logic here.)
    }
    
  • 如果要调用 RuntimeHelpers.PrepareConstrainedRegions,请删除该调用。 该调用在 .NET 5 及更高版本中无效。

    public void DoSomething_Old()
    {
        // REMOVE the call below.
        RuntimeHelpers.PrepareConstrainedRegions();
        try
        {
            // try code
        }
        finally
        {
            // cleanup code
        }
    }
    
    public void DoSomething_Corrected()
    {
        // There is no call to PrepareConstrainedRegions. It's a normal try / finally block.
    
        try
        {
            // try code
        }
        finally
        {
            // cleanup code
        }
    }
    
  • 如果调用 RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup,请将调用替换为标准 try/catch/finally 块。

    // The sample below produces warning SYSLIB0004.
    public void DoSomething_Old()
    {
        RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(MyTryCode, MyCleanupCode, null);
    }
    public void MyTryCode(object state) { /* try code */ }
    public void MyCleanupCode(object state, bool exceptionThrown) { /* cleanup code */ }
    
    // The corrected sample below does not produce warning SYSLIB0004.
    public void DoSomething_Corrected()
    {
        try
        {
            // try code
        }
        catch (Exception ex)
        {
            // exception handling code
        }
        finally
        {
            // cleanup code
        }
    }
    

抑制警告

如果必须使用已过时的 API,可在代码或项目文件中禁止显示警告。

若只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用警告。

// Disable the warning.
#pragma warning disable SYSLIB0004

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0004

若要禁止显示项目中的所有 SYSLIB0004 警告,请将属性 <NoWarn> 添加到项目文件。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0004</NoWarn>
  </PropertyGroup>
</Project>

有关详细信息,请参阅取消警告

另请参阅