SYSLIB0065: o definidor de AsnEncodedData.RawData está obsoleto

A partir do .NET 11, o acessor set de AsnEncodedData.RawData está obsoleto. Definir essa propriedade no código gera um aviso SYSLIB0065 em tempo de compilação.

Motivo da obsoletidade

AsnEncodedData representa um objeto codificado em ASN.1. Muitos tipos derivam dele, como X509BasicConstraintsExtension, e armazenam em cache sua representação decodificada para que o acesso à propriedade não decodifica repetidamente o ASN.1.

Como RawData não é virtual, defini-lo em uma instância derivada causa uma discrepância entre o estado decodificado armazenado em cache e os novos dados brutos. O tipo derivado não pode detectar que os dados brutos foram alterados, portanto, ele continua a retornar valores decodificados obsoletos. Por exemplo:

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

Solução alternativa

Para manter a coerência entre o estado decodificado e os dados subjacentes, use o construtor do tipo apropriado para decodificar dados. Trate instâncias como somente para leitura—construa uma nova instância em vez de reutilizar uma existente.

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

Se você precisar de um comportamento mutável, use AsnEncodedData.CopyFrom(AsnEncodedData). O CopyFrom método é virtual, portanto, os tipos derivados podem invalidar seu estado decodificado quando os dados brutos são alterados.

Suprimir um aviso

Se você precisar usar o setter obsoleto, poderá suprimir o aviso no código ou no arquivo de projeto.

Para suprimir apenas uma única violação, adicione diretivas de pré-processador ao arquivo de origem para desabilitar e, em seguida, habilitar novamente o aviso.

// Disable the warning.
#pragma warning disable SYSLIB0065

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

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

Para suprimir todos os SYSLIB0065 avisos em seu projeto, adicione uma <NoWarn> propriedade ao arquivo de projeto.

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

Para obter mais informações, consulte Suprimir avisos.