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