Compartilhar via


SYSLIB0004: não há suporte para o recurso CER (região de execução restrita)

O recurso CER (regiões de execução restrita) tem suporte apenas no .NET Framework. Dessa forma, várias APIs relacionadas à CER são marcadas como obsoletas, começando no .NET 5. O uso dessas APIs gera o aviso SYSLIB0004 no tempo de compilação.

As seguintes APIs relacionadas à CER são obsoletas:

No entanto, as seguintes APIs relacionadas à CER não estão obsoletas:

Soluções Alternativas

  • Se você aplicou um atributo CER a um método, remova o atributo. Esses atributos não têm efeito no .NET 5 e versões posteriores.

    // REMOVE the attribute below.
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public void DoSomething()
    {
    }
    
    // REMOVE the attribute below.
    [PrePrepareMethod]
    public void DoSomething()
    {
    }
    
  • Se você estiver chamando RuntimeHelpers.ProbeForSufficientStack ou RuntimeHelpers.PrepareContractedDelegate, remova a chamada. Essas chamadas não têm efeito no .NET 5 e versões posteriores.

    public void DoSomething()
    {
        // REMOVE the call below.
        RuntimeHelpers.ProbeForSufficientStack();
    
        // (Remainder of your method logic here.)
    }
    
  • Se você estiver chamando RuntimeHelpers.PrepareConstrainedRegions, remova a chamada. Essa chamada não tem efeito no .NET 5 e versões posteriores.

    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
        }
    }
    
  • Se você estiver chamando RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup, substitua a chamada por um bloco try/catch/finally padrão.

    // 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
        }
    }
    

Suprimir um aviso

Se for necessário usar as APIs obsoletas, você poderá suprimir o aviso no código ou no arquivo de projeto.

Para suprimir apenas uma violação única, adicione as diretivas de pré-processador ao arquivo de origem para desabilitar e, em seguida, reabilite o aviso.

// Disable the warning.
#pragma warning disable SYSLIB0004

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

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

Para suprimir todos os avisos SYSLIB0004 no projeto, adicione uma propriedade <NoWarn> ao arquivo de projeto.

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

Para obter mais informações, confira Suprimir avisos.

Confira também