Freigeben über


SafeHandle-Typen müssen über öffentlichen Konstruktor verfügen

Historisch erfordert das Übergeben von SafeHandle-abgeleiteten Typen an P/Invokes und COM-Methoden implizit einen parameterlosen Konstruktor jeder Sichtbarkeit, wenn ein SafeHandle-abgeleiteter Typ als ref oder out Parameter oder Rückgabetyp übergeben wird. Die von der Quelle generierte Interoperabilität in .NET 7 ermöglichte dieses Verhalten, um die einfachere Migration von DllImportAttribute-basierten P/Invokes zu ermöglichen. Gleichzeitig haben wir die SafeHandle-Dokumentation aktualisiert, um Implementierungen mitzuteilen, dass ein public parameterloser Konstruktor in ihrem abgeleiteten Typ bereitgestellt wird. Diese unterbrechungsfreie Änderung macht diese Empfehlung zu einer Anforderung für das quellgenerierte Marshalling.

Vorheriges Verhalten

Ein SafeHandle-abgeleiteter Typ war erforderlich, um einen parameterlosen Konstruktor jeder Sichtbarkeit zu haben, wenn er verwendet wurde:

Neues Verhalten

Ein SafeHandle-abgeleiteter Typ ist erforderlich, wenn er verwendet wird, über einen public parameterlosen Konstruktor verfügen:

Wenn der Typ keinen public parameterlosen Konstruktor aufweist, gibt der Interopquellgenerator einen Kompilierungsfehler aus.

Eingeführt in Version

.NET 8 Vorschauversion 5

Typ des Breaking Changes

Diese Änderung kann sich auf die Quellkompatibilität auswirken.

Grund für die Änderung

Die Interop-Quellgeneratoren ändern sich, um mehr Code aus den Quellgeneratoren selbst in die .NET-Kernbibliotheken zu verschieben. Im Rahmen dieser Änderung beginnt das Interop-Team mit der Durchsetzung der empfohlenen Richtlinien für wartbareren und verständlicheren Interop-Code.

Ändern Sie den vorhandenen nicht-public- parameterlosen Konstruktor für den SafeHandle- abgeleiteten Typ in public.

Betroffene APIs