Comparteix 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 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:

Comportamiento nuevo

Se requiere un tipo derivado de SafeHandle para tener un constructor public sin parámetros cuando se usa:

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.

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

API afectadas