Compartilhar via


Os tipos SafeHandle precisam ter um construtor público

Historicamente, passar tipos derivados de SafeHandle para métodos P/Invokes e COM exigia implicitamente um construtor sem parâmetros de qualquer visibilidade quando um tipo derivado de SafeHandle era passado como um parâmetro ref ou out ou um tipo de retorno. A interoperabilidade gerada pela origem no .NET 7 e permitiu que esse comportamento possibilitasse uma migração mais fácil de P/Invokes baseados em DllImportAttribute. Ao mesmo tempo, atualizamos a documentação do SafeHandle para instruir os implementadores a fornecer um construtor sem parâmetros public em seu tipo derivado. Essa alteração significativa torna essa recomendação um requisito para o marshalling gerado pela origem.

Comportamento anterior

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

Novo comportamento

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

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

Versão introduzida

.NET 8 versão prévia 5

Tipo de alteração interruptiva

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

Motivo da alteração

Os geradores de origem de interoperabilidade estão mudando para enviar mais código dos próprios geradores de origem 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 sustentável e compreensível.

Altere o construtor não public sem parâmetros existente no tipo derivado SafeHandle para ser public.

APIs afetadas