SYSLIB0065 : AsnEncodedData.RawData setter est obsolète

À partir de .NET 11, l’accesseur set de AsnEncodedData.RawData est obsolète. La définition de cette propriété dans le code génère un avertissement SYSLIB0065 au moment de la compilation.

Motif de l’obsolescence

AsnEncodedData représente un objet encodé ASN.1. De nombreux types dérivent de celui-ci, tels que X509BasicConstraintsExtension, et mettent en cache leur représentation décodée afin que l’accès aux propriétés ne décode pas à plusieurs reprises l’ASN.1.

Étant donné que RawData n’est pas défini sur virtual, le définir sur une instance dérivée entraîne un décalage entre l’état décodé mis en cache et les nouvelles données brutes. Le type dérivé ne peut pas détecter que les données brutes ont changé, de sorte qu’elle continue de retourner des valeurs décodées obsolètes. Par exemple:

X509BasicConstraintsExtension extension = new(
    certificateAuthority: true,
    hasPathLengthConstraint: true,
    pathLengthConstraint: 3,
    critical: true);

X509BasicConstraintsExtension decoded = new();
decoded.RawData = extension.RawData;
Console.WriteLine(decoded.CertificateAuthority);      // Unexpectedly prints False
Console.WriteLine(decoded.HasPathLengthConstraint);   // Unexpectedly prints False
Console.WriteLine(decoded.PathLengthConstraint);      // Unexpectedly prints 0

Contournement

Pour maintenir la cohérence entre l’état décodé et les données sous-jacentes, utilisez le constructeur du type approprié pour décoder les données. Traitez les instances en lecture seule : construisez une nouvelle instance au lieu de réutiliser une instance existante.

// Instead of setting RawData, use the constructor.
X509BasicConstraintsExtension decoded = new(extension, extension.Critical);

Si vous avez besoin d’un comportement mutable, utilisez AsnEncodedData.CopyFrom(AsnEncodedData). La CopyFrom méthode est virtual, de sorte que les types dérivés peuvent invalider leur état décodé lorsque les données brutes changent.

Supprimer un avertissement

Si vous devez utiliser le setter obsolète, vous pouvez supprimer l’avertissement dans le code ou dans votre fichier projet.

Pour supprimer une seule violation, ajoutez des directives de préprocesseur à votre fichier source pour désactiver, puis réactiver l’avertissement.

// Disable the warning.
#pragma warning disable SYSLIB0065

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

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

Pour supprimer tous les SYSLIB0065 avertissements dans votre projet, ajoutez une <NoWarn> propriété à votre fichier projet.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0065</NoWarn>
  </PropertyGroup>
</Project>

Pour plus d’informations, consultez Supprimer des avertissements.