SYSLIB0004. Функция ограниченного выполнения (CER) не поддерживается.

Функция областей ограниченного выполнения (CER) поддерживается только в .NET Framework. Таким образом, различные API, связанные с этой функцией, помечаются как устаревшие, начиная с .NET 5. При использовании этих API во время компиляции создается предупреждение SYSLIB0004.

Следующие интерфейсы API, связанные с функцией областей ограниченного выполнения (CER), являются устаревшими:

Однако следующие API, связанные с CER, не являются устаревшими:

Методы обхода проблемы

  • Если к методу применен атрибут CER, удалите его. Эти атрибуты не действуют в .NET 5 и более поздних версиях.

    // REMOVE the attribute below.
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public void DoSomething()
    {
    }
    
    // REMOVE the attribute below.
    [PrePrepareMethod]
    public void DoSomething()
    {
    }
    
  • При вызове RuntimeHelpers.ProbeForSufficientStack или RuntimeHelpers.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>

Дополнительные сведения см. в разделе Отключение предупреждений.

См. также