Condividi tramite


SYSLIB0004: La funzionalità area di esecuzione vincolata (CER) non è supportata

La funzionalità Aree di esecuzione vincolate (CER) è supportata solo in .NET Framework. Di conseguenza, diverse API correlate a CER sono contrassegnate come obsolete, a partire da .NET 5. L'uso di queste API genera un avviso SYSLIB0004 in fase di compilazione.

Le API seguenti correlate a CER sono obsolete:

Tuttavia, le API seguenti correlate a CER non sono obsolete:

Soluzioni alternative

  • Se è stato applicato un attributo CER a un metodo, rimuoverlo. Questi attributi non hanno alcun effetto in .NET 5 e versioni successive.

    // REMOVE the attribute below.
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    public void DoSomething()
    {
    }
    
    // REMOVE the attribute below.
    [PrePrepareMethod]
    public void DoSomething()
    {
    }
    
  • Se si chiama RuntimeHelpers.ProbeForSufficientStack o RuntimeHelpers.PrepareContractedDelegate, rimuovere la chiamata. Queste chiamate non hanno alcun effetto in .NET 5 e versioni successive.

    public void DoSomething()
    {
        // REMOVE the call below.
        RuntimeHelpers.ProbeForSufficientStack();
    
        // (Remainder of your method logic here.)
    }
    
  • Se si chiama RuntimeHelpers.PrepareConstrainedRegions, rimuovere la chiamata. Questa chiamata non ha alcun effetto in .NET 5 e versioni successive.

    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 si chiama RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup, sostituire la chiamata con un blocco try/catch/finally standard.

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

Eliminare un avviso

Se è necessario usare le API obsolete, è possibile eliminare l'avviso nel codice o nel file di progetto.

Per eliminare solo una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare l'avviso.

// Disable the warning.
#pragma warning disable SYSLIB0004

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

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

Per eliminare tutti gli avvisi SYSLIB0004 nel progetto, aggiungere una proprietà <NoWarn> al file di progetto.

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

Per altre informazioni, vedere Non visualizzare gli avvisi.

Vedi anche