SYSLIB0004:不支援限制的執行區域 (CER) 特徵
只有 .NET Framework 支援限制的執行區域 (CER) 功能。 因此,從 .NET 5 開始,各種 CER 相關 API 都會標示為已淘汰。 使用這些 API 會在編譯時期產生警告 SYSLIB0004
。
下列 CER 相關 API 已淘汰:
- 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
不過,下列 CER 相關 API 並未淘汰:
- RuntimeHelpers.PrepareDelegate(Delegate)
- RuntimeHelpers.PrepareMethod
- System.Runtime.ConstrainedExecution.CriticalFinalizerObject
因應措施
如果您已將 CER 屬性套用至方法,請移除該屬性。 這些屬性在 .NET 5 和更新版本中不會有影響。
// REMOVE the attribute below. [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public void DoSomething() { } // REMOVE the attribute below. [PrePrepareMethod] public void DoSomething() { }
如果您要呼叫
RuntimeHelpers.ProbeForSufficientStack
或RuntimeHelpers.PrepareContractedDelegate
,請移除該呼叫。 這些呼叫在 .NET 5 和更新版本中不會有影響。public void DoSomething() { // REMOVE the call below. RuntimeHelpers.ProbeForSufficientStack(); // (Remainder of your method logic here.) }
如果您呼叫
RuntimeHelpers.PrepareConstrainedRegions
,請移除該呼叫。 此呼叫在 .NET 5 和更新版本中沒有作用。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 } }
如果您要呼叫
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup
,請以標準try/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 } }
隱藏警告
若您必須使用已淘汰的 API,您可以在程式碼或專案檔中隱藏警告。
若要只隱藏單一違規,請將前置處理器指示詞新增至原始程式碼檔案,以停用並重新啟用警告。
// Disable the warning.
#pragma warning disable SYSLIB0004
// Code that uses obsolete API.
// ...
// Re-enable the warning.
#pragma warning restore SYSLIB0004
若要隱藏專案中的所有 SYSLIB0004
警告,請將 <NoWarn>
屬性新增至專案檔。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);SYSLIB0004</NoWarn>
</PropertyGroup>
</Project>
如需詳細資訊,請參閱隱藏警告。