SYSLIB0004: De functie voor beperkte uitvoeringsregio (CER) wordt niet ondersteund
De functie Beperkte uitvoeringsregio's (CER) wordt alleen ondersteund in .NET Framework. Daarom worden verschillende CER-gerelateerde API's gemarkeerd als verouderd, te beginnen in .NET 5. Met deze API's genereert u een waarschuwing SYSLIB0004
tijdens het compileren.
De volgende CER-gerelateerde API's zijn verouderd:
- 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
De volgende CER-gerelateerde API's zijn echter niet verouderd:
- RuntimeHelpers.PrepareDelegate(Delegate)
- RuntimeHelpers.PrepareMethod
- System.Runtime.ConstrainedExecution.CriticalFinalizerObject
Tijdelijke oplossingen
Als u een CER-kenmerk hebt toegepast op een methode, verwijdert u het kenmerk. Deze kenmerken hebben geen effect in .NET 5 en latere versies.
// REMOVE the attribute below. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public void DoSomething() { } // REMOVE the attribute below. [PrePrepareMethod] public void DoSomething() { }
Als u belt
RuntimeHelpers.ProbeForSufficientStack
ofRuntimeHelpers.PrepareContractedDelegate
, verwijdert u de oproep. Deze aanroepen hebben geen effect in .NET 5 en latere versies.public void DoSomething() { // REMOVE the call below. RuntimeHelpers.ProbeForSufficientStack(); // (Remainder of your method logic here.) }
Als u belt
RuntimeHelpers.PrepareConstrainedRegions
, verwijdert u de oproep. Deze aanroep heeft geen effect in .NET 5 en latere versies.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 } }
Als u belt
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
, vervangt u de oproep door een standaardbloktry/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 } }
Een waarschuwing onderdrukken
Als u de verouderde API's moet gebruiken, kunt u de waarschuwing in code of in het projectbestand onderdrukken.
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de waarschuwing uit te schakelen en vervolgens opnieuw in te schakelen.
// Disable the warning.
#pragma warning disable SYSLIB0004
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0004
Als u alle SYSLIB0004
waarschuwingen in uw project wilt onderdrukken, voegt u een <NoWarn>
eigenschap toe aan het projectbestand.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0004</NoWarn>
</PropertyGroup>
</Project>
Zie Waarschuwingen onderdrukken voor meer informatie.