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:
- Como um parâmetro
ref
ouout
ou um tipo de retorno em um método atribuído a LibraryImportAttribute. - Em um método em uma interface atribuída a GeneratedComInterfaceAttribute.
Novo comportamento
Um tipo derivado de SafeHandle é necessário para ter um construtor public
sem parâmetros quando é usado:
- Como um parâmetro
ref
ouout
ou um tipo de retorno em um método atribuído a LibraryImportAttribute. - Em um método em uma interface atribuída a GeneratedComInterfaceAttribute.
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.
Ação recomendada
Altere o construtor não public
sem parâmetros existente no tipo derivado SafeHandle
para ser public
.