SYSLIB0065: Il setter AsnEncodedData.RawData è obsoleto

A partire da .NET 11, l'accessor set di AsnEncodedData.RawData è obsoleto. L'impostazione di questa proprietà nel codice genera un avviso SYSLIB0065 in fase di compilazione.

Motivo dell'obsoletione

AsnEncodedData rappresenta un oggetto con codifica ASN.1. Molti tipi derivano da esso, ad esempio X509BasicConstraintsExtension, e memorizzano nella cache la relativa rappresentazione decodificata in modo che l'accesso alle proprietà non decodifica ripetutamente l'ASN.1.

Poiché RawData non è virtual, impostarlo in un'istanza derivata causa una discrepanza tra lo stato decodificato memorizzato nella cache e i nuovi dati grezzi. Il tipo derivato non riesce a rilevare che i dati non elaborati sono stati modificati, quindi continuano a restituire valori decodificati non aggiornati. Per esempio:

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

Soluzione

Per mantenere la coerenza tra lo stato decodificato e i dati sottostanti, usare il costruttore del tipo appropriato per decodificare i dati. Considerare le istanze come di sola lettura: costruire una nuova istanza invece di riutilizzare una istanza esistente.

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

Se è necessario un comportamento modificabile, usare AsnEncodedData.CopyFrom(AsnEncodedData). Il CopyFrom metodo è virtual, quindi i tipi derivati possono invalidare lo stato decodificato quando i dati non elaborati cambiano.

Eliminare un avviso

Se è necessario usare il setter obsoleto, è possibile eliminare l'avviso nel codice o nel file di progetto.

Per eliminare solo una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare l'avviso.

// Disable the warning.
#pragma warning disable SYSLIB0065

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

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

Per eliminare tutti gli SYSLIB0065 avvisi nel progetto, aggiungere una <NoWarn> proprietà al file di progetto.

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

Per altre informazioni, vedere Eliminare gli avvisi.