Valv Handle-typer måste ha en offentlig konstruktor
Tidigare har överföring SafeHandleav -härledda typer till P/Invokes- och COM-metoder implicit krävt en parameterlös konstruktor för all synlighet när en SafeHandle
-härledd typ skickas som en eller out
parameter ref
eller en returtyp. Källgenererad interop i .NET 7 tillät det här beteendet att möjliggöra enklare migrering från DllImportAttribute-baserade P/Invokes. Samtidigt uppdaterade vi Valv Handle-dokumentationen för att be implementerarna att tillhandahålla en public
parameterlös konstruktor i sin härledda typ. Den här icke-bakåtkompatibla ändringen gör rekommendationen till ett krav för källgenererad marshalling.
Tidigare beteende
En SafeHandle-härledd typ krävdes för att ha en parameterlös konstruktor för all synlighet när den användes:
- Som en
ref
parameter ellerout
en returtyp i en LibraryImportAttribute-attributmetod. - I en metod i ett GeneratedComInterfaceAttribute-attributgränssnitt.
Nytt beteende
En SafeHandle-härledd typ krävs för att ha en public
parameterlös konstruktor när den används:
- Som en
ref
parameter ellerout
en returtyp i en LibraryImportAttribute-attributmetod. - I en metod i ett GeneratedComInterfaceAttribute-attributgränssnitt.
Om typen inte har en public
parameterlös konstruktor genererar interop-källgeneratorn ett kompileringsfel.
Version introducerad
Förhandsversion 5 av .NET 8
Typ av icke-bakåtkompatibel ändring
Den här ändringen kan påverka källkompatibiliteten.
Orsak till ändringen
Interop-källgeneratorerna ändras för att push-överföra mer kod från själva källgeneratorerna och till kärnbiblioteken för .NET. Som en del av den här ändringen börjar interop-teamet tillämpa de rekommenderade riktlinjerna för mer underhållsbar och begriplig interop-kod.
Rekommenderad åtgärd
Ändra den befintliga icke-parameterlösapublic
konstruktorn för - SafeHandle
derived-typen till public
.