Los tipos SafeHandle deben tener un constructor público.
Históricamente, pasar tipos derivados de SafeHandle a P/Invokes y métodos COM ha requerido implícitamente un constructor sin parámetros de cualquier visibilidad cuando un tipo derivado de SafeHandle
se pasa como un parámetro ref
u out
o un tipo de valor devuelto. La interoperabilidad generada por el origen en .NET 7 permitió este comportamiento habilitar la migración más sencilla desde DllImportAttributebasado en P/Invokes. Al mismo tiempo, hemos actualizado la documentación de SafeHandle para indicar a los implementadores que proporcionen un constructor public
sin parámetros en su tipo derivado. Este cambio importante hace que esa recomendación sea un requisito para la serialización generada por el origen.
Comportamiento anterior
Se requería un tipo derivado de SafeHandle para tener un constructor sin parámetros de cualquier visibilidad cuando se usaba:
- Como parámetro
ref
uout
o un tipo de valor devuelto en un método con atributos de LibraryImportAttribute. - En un método en una interfaz con atributos de GeneratedComInterfaceAttribute.
Comportamiento nuevo
Se requiere un tipo derivado de SafeHandle para tener un constructor public
sin parámetros cuando se usa:
- Como parámetro
ref
uout
o un tipo de valor devuelto en un método con atributos de LibraryImportAttribute. - En un método en una interfaz con atributos de GeneratedComInterfaceAttribute.
Si el tipo no tiene un constructor public
sin parámetros, el generador de origen de interoperabilidad emite un error de compilación.
Versión introducida
.NET 8 (versión preliminar 5)
Tipo de cambio importante
Este cambio puede afectar a la compatibilidad de orígenes.
Motivo del cambio
Los generadores de origen de interoperabilidad están cambiando para insertar más código fuera de los propios generadores de origen y en las bibliotecas principales de .NET. Como parte de este cambio, el equipo de interoperabilidad empieza a aplicar las directrices recomendadas para un código de interoperabilidad más fácil de mantener y comprender.
Acción recomendada
Cambie el constructor no public
sin parámetros existente en el tipo derivado de SafeHandle
para que sea public
.