.NET 5+ 中已过时的功能

从 .NET 5 开始,一些新标记为已过时的 API 使用 ObsoleteAttribute 上的两个新属性。

  • ObsoleteAttribute.DiagnosticId 属性指示编译器使用自定义诊断 ID 产生生成警告。 通过自定义 ID 可专门、单独地取消过时警告。 对于 .NET 5+ 过时,自定义诊断 ID 的格式为 SYSLIB0XXX

  • ObsoleteAttribute.UrlFormat 属性指示编译器包含一个 URL 链接,可了解有关过时的详细信息。

如果由于使用过时的 API 而遇到生成警告或错误,请遵循参考部分中列出的诊断 ID 所提供的特定指导。 不能使用过时类型或成员的标准诊断 ID (CS0618) 取消有关这些过时类型或成员的警告或错误;请改用自定义 SYSLIB0XXX 诊断 ID 值。 有关详细信息,请参阅取消警告

参考

下表提供了 .NET 5+ 中 SYSLIB0XXX 过时的索引。

诊断 ID 警告或错误 说明
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 警告 接受算法名称的加密工厂方法已过时。 请改为对算法类型使用无参数 Create 工厂方法。
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 警告 支持 Regex 扩展性过时机制的 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>

注意

以这种方式取消警告只会禁用指定的过时警告。 它不会禁用任何其他警告,包括具有不同诊断 ID 的其他过时警告。

请参阅