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:
- Als Parameter
ref
oderout
Rückgabetyp in einer LibraryImportAttribute-Attribut-Methode. - In einer Methode für eine GeneratedComInterfaceAttribute-Attribut-Schnittstelle.
Neues Verhalten
Ein SafeHandle-abgeleiteter Typ ist erforderlich, wenn er verwendet wird, über einen public
parameterlosen Konstruktor verfügen:
- Als Parameter
ref
oderout
Rückgabetyp in einer LibraryImportAttribute-Attribut-Methode. - In einer Methode für eine GeneratedComInterfaceAttribute-Attribut-Schnittstelle.
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.
Empfohlene Maßnahme
Ändern Sie den vorhandenen nicht-public
- parameterlosen Konstruktor für den SafeHandle
- abgeleiteten Typ in public
.