SYSLIB0004: no se admite la característica de regiones de ejecución restringidas (CER)
La característica de regiones de ejecución restringidas (CER) solo se admite en .NET Framework. Por tanto, varias API relacionadas con CER se han marcado como obsoletas a partir de .NET 5. El uso de estas API genera una advertencia SYSLIB0004
en tiempo de compilación.
Las siguientes API relacionadas con CER están obsoletas:
- RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(RuntimeHelpers+TryCode, RuntimeHelpers+CleanupCode, Object)
- RuntimeHelpers.PrepareConstrainedRegions()
- RuntimeHelpers.PrepareConstrainedRegionsNoOP()
- RuntimeHelpers.PrepareContractedDelegate(Delegate)
- RuntimeHelpers.ProbeForSufficientStack()
- System.Runtime.ConstrainedExecution.Cer
- System.Runtime.ConstrainedExecution.Consistency
- System.Runtime.ConstrainedExecution.PrePrepareMethodAttribute
- System.Runtime.ConstrainedExecution.ReliabilityContractAttribute
En cambio, las siguientes API relacionadas con CER no están obsoletas:
- RuntimeHelpers.PrepareDelegate(Delegate)
- RuntimeHelpers.PrepareMethod
- System.Runtime.ConstrainedExecution.CriticalFinalizerObject
Soluciones
Si ha aplicado un atributo CER a un método, quite el atributo. Estos atributos no tienen ningún efecto en .NET 5 y versiones posteriores.
// REMOVE the attribute below. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public void DoSomething() { } // REMOVE the attribute below. [PrePrepareMethod] public void DoSomething() { }
Si llama a
RuntimeHelpers.ProbeForSufficientStack
oRuntimeHelpers.PrepareContractedDelegate
, quite la llamada. Estas llamadas no tienen ningún efecto en .NET 5 y versiones posteriores.public void DoSomething() { // REMOVE the call below. RuntimeHelpers.ProbeForSufficientStack(); // (Remainder of your method logic here.) }
Si llama a
RuntimeHelpers.PrepareConstrainedRegions
, quite la llamada. Esta llamada no tiene ningún efecto en .NET 5 y versiones 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 } }
Si llama a
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
, reemplace la llamada por un bloquetry/catch/finally
estándar.// 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 } }
Supresión de una advertencia
Si tiene que seguir usando las API obsoletas, puede suprimir la advertencia en el código o en el archivo de proyecto.
Para suprimir solo una infracción, agregue directivas de preprocesador al archivo de origen para deshabilitar y luego volver a habilitar la advertencia.
// Disable the warning.
#pragma warning disable SYSLIB0004
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0004
Para suprimir todas las advertencias SYSLIB0004
del proyecto, agregue una propiedad <NoWarn>
al archivo del proyecto.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0004</NoWarn>
</PropertyGroup>
</Project>
Para obtener más información, vea Suprimir advertencias.