.NET 5+ 中的已淘汰功能

從 .NET 5 開始,某些新標示為已淘汰的 API 會使用 ObsoleteAttribute 上的兩個新屬性。

  • ObsoleteAttribute.DiagnosticId 屬性會告知編譯器使用自訂診斷識別碼產生建置警告。 自訂識別碼允許明確地隱藏淘汰警告,並彼此分開。 在 .NET 5+ 淘汰的情況下,自訂診斷識別碼的格式為 SYSLIB0XXX

  • ObsoleteAttribute.UrlFormat 屬性會告知編譯器包含深入了解淘汰的 URL 連結。

如果您由於使用已淘汰 API 而遇到建置警告或錯誤,請遵循針對參考一節中列出的診斷識別碼提供的特定指導。 使用已淘汰型別或成員的標準診斷識別碼 (CS0618)無法隱藏這些淘汰的警告或錯誤;請改用自訂 SYSLIB0XXX 診斷識別碼值。 如需詳細資訊,請參閱隱藏警告

參考

下表提供 .NET 5+ 中對於 SYSLIB0XXX 淘汰的索引。

診斷識別碼 警告或錯誤 描述
SYSLIB0001 警告 UTF-7 編碼不安全,不應該使用。 請考慮改用 UTF-8。
SYSLIB0002 錯誤 PrincipalPermissionAttribute 不被執行階段接受,不得使用。
SYSLIB0003 警告 執行階段不支援或接受程式碼存取安全性 (CAS)。
SYSLIB0004 警告 不支援限制的執行區域 (CER) 特徵。
SYSLIB0005 警告 不支援全域組件快取 (GAC)。
SYSLIB0006 警告 不支援 Thread.Abort() 屬性,而且會擲回 PlatformNotSupportedException
SYSLIB0007 警告 不支援此密碼編譯演算法的預設實作。
SYSLIB0008 警告 不支援 CreatePdbGenerator() API,而且會擲回 PlatformNotSupportedException
SYSLIB0009 警告 不支援 AuthenticationManager。 方法不會執行任何作業或擲回 PlatformNotSupportedException
SYSLIB0010 警告 不支援某些遠端 API,而且會擲回 PlatformNotSupportedException
SYSLIB0011 警告 BinaryFormatter 序列化已淘汰,不應該使用。
SYSLIB0012 警告 Assembly.CodeBaseAssembly.EscapedCodeBase 僅針對 .NET Framework 相容性而包含。 請改用 Assembly.Location
SYSLIB0013 警告 在某些情況下,Uri.EscapeUriString(String) 可能會損毀 URI 字串。 請考慮針對查詢字串元件改用 Uri.EscapeDataString(String)
SYSLIB0014 警告 WebRequestHttpWebRequestServicePointWebClient 已淘汰。 請改用 HttpClient
SYSLIB0015 警告 DisablePrivateReflectionAttribute 在 .NET 6+ 中沒有作用。
SYSLIB0016 警告 為了提升效能並減少配置,請使用可以接受引數的 Graphics.GetContextInfo 多載。
SYSLIB0017 警告 不支援強式名稱簽署,而且會擲回 PlatformNotSupportedException
SYSLIB0018 警告 不支援僅限反映的載入,而且會擲回 PlatformNotSupportedException
SYSLIB0019 警告 不再支援 System.Runtime.InteropServices.RuntimeEnvironment 成員 SystemConfigurationFileGetRuntimeInterfaceAsIntPtr(Guid, Guid)GetRuntimeInterfaceAsObject(Guid, Guid),而且會擲回 PlatformNotSupportedException
SYSLIB0020 警告 JsonSerializerOptions.IgnoreNullValues 已經過時。 若要在進行序列化時忽略 null 值,請將 DefaultIgnoreCondition 設定為 JsonIgnoreCondition.WhenWritingNull
SYSLIB0021 警告 衍生的密碼編譯類型已淘汰。 請改用基底類型上的 Create 方法。
SYSLIB0022 警告 RijndaelRijndaelManaged 類型已淘汰。 請改用 Aes
SYSLIB0023 警告 RNGCryptoServiceProvider 已經過時。 若要產生亂數,請改用其中一種 RandomNumberGenerator 靜態方法。
SYSLIB0024 警告 不支援建立和卸載 AppDomains,而且會擲回例外狀況。
SYSLIB0025 警告 SuppressIldasmAttribute 在 .NET 6+ 中沒有作用。
SYSLIB0026 警告 X509CertificateX509Certificate2 是不可變的。 請使用適當的建構函式來建立新的憑證。
SYSLIB0027 警告 PublicKey.Key 已經過時。 請使用適當的方法來取得公開金鑰,例如 GetRSAPublicKey()
SYSLIB0028 警告 X509Certificate2.PrivateKey 已經過時。 請使用適當的方法 (例如 RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2)) 來取得私密金鑰,或使用 X509Certificate2.CopyWithPrivateKey(ECDiffieHellman) 方法來建立具有私密金鑰的新執行個體。
SYSLIB0029 警告 ProduceLegacyHmacValues 已經過時。 不再支援產生舊版的 HMAC 值。
SYSLIB0030 警告 HMACSHA1 一律會使用平台所提供的演算法實作。 請使用不含 useManagedSha1 參數的建構函式。
SYSLIB0031 警告 CryptoConfig.EncodeOID(String) 已經過時。 請使用 System.Formats.Asn1 中提供的 ASN.1 功能。
SYSLIB0032 警告 不支援從損毀的流程狀態例外狀況復原;會忽略 HandleProcessCorruptedStateExceptionsAttribute
SYSLIB0033 警告 Rfc2898DeriveBytes.CryptDeriveKey(String, String, Int32, Byte[]) 已淘汰且不受支援。 請改用 PasswordDeriveBytes.CryptDeriveKey(String, String, Int32, Byte[])
SYSLIB0034 警告 CmsSigner(CspParameters) 已經過時。 請改用替代建構函式。
SYSLIB0035 警告 SignerInfo.ComputeCounterSignature() 已經過時。 請改用接受 CmsSigner 的多載。
SYSLIB0036 警告 Regex.CompileToAssembly 已淘汰且不受支援。 請改用 RegexGeneratorAttribute 搭配規則運算式來源產生器。
SYSLIB0037 警告 AssemblyName 成員 HashAlgorithmProcessorArchitectureVersionCompatibility 已淘汰,且不受支援。
SYSLIB0038 警告 SerializationFormat.Binary 已經淘汰,不應繼續使用。
SYSLIB0039 警告 TLS 1.0 和 1.1 版有已知的弱點,不建議使用。 請改用較新的 TLS 版本,或使用 SslProtocols.None 來延遲 OS 預設。
SYSLIB0040 警告 EncryptionPolicy.NoEncryptionEncryptionPolicy.AllowNoEncryption 會大幅減少安全性,不應用於生產程式碼。
SYSLIB0041 警告 Rfc2898DeriveBytes 建構函式中的預設雜湊演算法和反覆項目計數已淘汰且不安全。 使用接受雜湊演算法和反復項目數目的建構函式。
SYSLIB0042 警告 ToXmlStringFromXmlString 沒有實作橢圓曲線密碼編譯 (ECC) 類型,而且已經淘汰。 使用標準匯入和匯出格式,例如針對公開金鑰為 ExportSubjectPublicKeyInfoImportSubjectPublicKeyInfo,或者針對私密金鑰為 ExportPkcs8PrivateKeyImportPkcs8PrivateKey
SYSLIB0043 警告 ECDiffieHellmanPublicKey.ToByteArray() 和相關聯的建構函式在所有平台上都沒有一致且互通的實作。 請改用 ECDiffieHellmanPublicKey.ExportSubjectPublicKeyInfo()
SYSLIB0044 警告 AssemblyName.CodeBaseAssemblyName.EscapedCodeBase 已淘汰。 不支援將其用來載入組件。
SYSLIB0045 警告 接受演算法名稱的密碼編譯 Factory 方法已淘汰。 請改用演算法類型的無參數 Create Factory 方法。
SYSLIB0046 警告 ControlledExecution.Run(Action, CancellationToken) 方法可能會損毀流程,所以不應該用於生產程式碼。
SYSLIB0047 警告 XmlSecureResolver 已經過時。 嘗試禁止 XML 外部實體解析時,請改用 XmlResolver.ThrowingResolver
SYSLIB0048 警告 RSA.EncryptValue(Byte[])RSA.DecryptValue(Byte[]) 已淘汰。 請改用 RSA.EncryptRSA.Decrypt
SYSLIB0049 警告 JsonSerializerOptions.AddContext 已淘汰。 若要註冊 JsonSerializerContext,請使用 TypeInfoResolver 或 TypeInfoResolverChain 屬性。
SYSLIB0050 警告 格式器型序列化已淘汰,不應使用。
SYSLIB0051 警告 支援已淘汰的格式器型序列化的 API 已淘汰。 不應透過應用程式程式碼呼叫或延伸它們。
SYSLIB0052 警告 支援規則運算式擴充性已淘汰機制的 API 已淘汰。
SYSLIB0053 警告 AesGcm 應該指出加密和解密所需的標記大小。 使用接受該標記大小的建構函式。
SYSLIB0054 警告 Thread.VolatileReadThread.VolatileWrite 已淘汰。 請改用 Volatile.ReadVolatile.Write
SYSLIB0055 警告 AdvSimd.ShiftRightLogicalRoundedNarrowingSaturate* 方法搭配帶正負號的參數是過時的做法。 請改用不帶正負號的多載。
SYSLIB0056 警告 具有自訂 AssemblyHashAlgorithmAssembly.LoadFrom 已淘汰。 使用不含 AssemblyHashAlgorithm 的多載。
SYSLIB0057 警告 二進位和檔案內容的 X509Certificate2X509Certificate 建構函式已經過時。

隱藏警告

建議您盡可能使用可用的因應措施。 然而,若您無法變更程式碼,則可以透過 #pragma 指示詞或 <NoWarn> 專案設定來隱藏警告。 如果您必須使用已淘汰的 API,而且 SYSLIB0XXX 診斷不會呈現錯誤,您可以在程式碼或專案檔中隱藏警告。

若要隱藏程式碼中的警告:

// Disable the warning.
#pragma warning disable SYSLIB0001

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

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

若要隱藏專案檔中的警告:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   <TargetFramework>net6.0</TargetFramework>
   <!-- NoWarn below suppresses SYSLIB0001 project-wide -->
   <NoWarn>$(NoWarn);SYSLIB0001</NoWarn>
   <!-- To suppress multiple warnings, you can use multiple NoWarn elements -->
   <NoWarn>$(NoWarn);SYSLIB0002</NoWarn>
   <NoWarn>$(NoWarn);SYSLIB0003</NoWarn>
   <!-- Alternatively, you can suppress multiple warnings by using a semicolon-delimited list -->
   <NoWarn>$(NoWarn);SYSLIB0001;SYSLIB0002;SYSLIB0003</NoWarn>
  </PropertyGroup>
</Project>

注意

以這種方式隱藏警告只會停用您指定的淘汰警告。 不會停用其他任何警告,包括具有不同診斷識別碼的淘汰警告。

另請參閱