SafeHandle-typen moeten openbare constructor hebben
In het verleden heeft het doorgeven SafeHandlevan -afgeleide typen aan P/Invokes en COM-methoden impliciet een parameterloze constructor van elke zichtbaarheid vereist wanneer een -afgeleide type wordt doorgegeven als een SafeHandle
ref
of out
parameter of een retourtype. Door de bron gegenereerde interoperabiliteit in .NET 7 heeft dit gedrag toegestaan om eenvoudigere migratie vanuit P/Invokes op basis van DllImportAttributeP/Invokes mogelijk te maken. Tegelijkertijd hebben we de SafeHandle-documentatie bijgewerkt om implementeerfuncties te informeren over een public
parameterloze constructor in hun afgeleide type. Deze wijziging die fouten veroorzaakt, maakt die aanbeveling een vereiste voor door de bron gegenereerde marshalling.
Vorig gedrag
Een SafeHandle-afgeleide type was vereist om een parameterloze constructor van elke zichtbaarheid te hebben toen deze werd gebruikt:
- Als een
ref
of parameter ofout
een retourtype in een LibraryImportAttribute-toegeschreven methode. - In een methode op een GeneratedComInterfaceAttribute-toegeschreven interface.
Nieuw gedrag
Een SafeHandle-afgeleide type is vereist om een public
parameterloze constructor te hebben wanneer deze wordt gebruikt:
- Als een
ref
of parameter ofout
een retourtype in een LibraryImportAttribute-toegeschreven methode. - In een methode op een GeneratedComInterfaceAttribute-toegeschreven interface.
Als het type geen parameterloze constructor heeft public
, verzendt de interop-brongenerator een compileerfout.
Versie geïntroduceerd
.NET 8 Preview 5
Type wijziging die fouten veroorzaken
Deze wijziging kan van invloed zijn op de broncompatibiliteit.
Reden voor wijziging
De interoperabiliteitsbrongeneratoren veranderen om meer code uit de brongeneratoren zelf en in de kernbibliotheken van .NET te pushen. Als onderdeel van deze wijziging begint het interoperabiliteitsteam de aanbevolen richtlijnen af te dwingen voor beter onderhoudbare en begrijpelijke interop-code.
Aanbevolen actie
Wijzig de bestaande niet-parameterlozepublic
constructor op het SafeHandle
afgeleide type in .public