Compartir a través de


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 la fuente en .NET 7 permitió habilitar este comportamiento para facilitar la migración desde las P/Invokes basadas en DllImportAttribute. Al mismo tiempo, actualizamos la documentación de SafeHandle para indicar a los implementadores que proporcionen un public constructor 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:

Nuevo comportamiento

Se requiere un tipo derivado SafeHandle que tenga un constructor sin parámetros public cuando se utiliza:

Si el tipo no tiene un public constructor 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 disruptivo

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.

Cambie el constructor no public sin parámetros existente en el tipo derivado de SafeHandle para que sea public.

Las APIs afectadas