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:
- 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
No entanto, as seguintes APIs relacionadas à CER não estão obsoletas:
- RuntimeHelpers.PrepareDelegate(Delegate)
- RuntimeHelpers.PrepareMethod
- System.Runtime.ConstrainedExecution.CriticalFinalizerObject
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
ouRuntimeHelpers.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 blocotry/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.