Partilhar via


Os tipos SafeHandle devem ter construtor público

Historicamente, a passagem SafeHandlede tipos derivados para P/Invokes e métodos COM implicitamente exigiu um construtor sem parâmetros de qualquer visibilidade quando um SafeHandletipo derivado é passado como um ref parâmetro ou out um tipo de retorno. A interoperabilidade gerada pelo código-fonte no .NET 7 permitiu que esse comportamento permitisse uma migração mais fácil de DllImportAttributeP/Invokes baseados em fontes. Ao mesmo tempo, atualizamos a documentação do SafeHandle para dizer aos implementadores para fornecer um public construtor sem parâmetros em seu tipo derivado. Esta alteração torna essa recomendação um requisito para o agrupamento gerado na fonte.

Comportamento anterior

Um SafeHandletipo derivado era necessário para ter um construtor sem parâmetros de qualquer visibilidade quando era usado:

Novo comportamento

Um SafeHandletipo derivado é necessário para ter um public construtor sem parâmetros quando é usado:

Se o tipo não tiver um public construtor sem parâmetros, o gerador de origem de interoperabilidade emitirá um erro de compilação.

Versão introduzida

.NET 8 Visualização 5

Tipo de mudança de rutura

Essa alteração pode afetar a compatibilidade da fonte.

Razão para a alteração

Os geradores de código-fonte de interoperabilidade estão mudando para enviar mais código dos próprios geradores de código-fonte para as bibliotecas principais do .NET. Como parte dessa mudança, a equipe de interoperabilidade está começando a aplicar as diretrizes recomendadas para um código de interoperabilidade mais fácil de manter e compreender.

Altere o construtor não-paramétricopublic existente no SafeHandletipo -derivado para ser public.

APIs afetadas