Anpassa parameterr marshalling
När .NET-körningens standardparameters marshallingbeteende inte gör vad du vill kan du använda System.Runtime.InteropServices.MarshalAsAttribute attributet för att anpassa hur parametrarna är ordnade. De här anpassningsfunktionerna gäller inte när runtime-marshalling inaktiveras.
Kommentar
Källgenererad interop för P/Invokes och COM respekterar endast en liten delmängd av MarshalAsAttribute parametrarna. Vi rekommenderar att du använder MarshalUsingAttribute för källgenererad interop i stället. Mer information finns i Anpassad marshalling för källgenerering.
Anpassa strängparametrar
.NET har en mängd olika format för marshallingsträngar. Dessa metoder är uppdelade i distinkta avsnitt i C-formatsträngar och Windows-centrerad strängformat.
C-formatsträngar
Vart och ett av dessa format skickar en null-avslutad sträng till intern kod. De skiljer sig åt med kodningen av den inbyggda strängen.
System.Runtime.InteropServices.UnmanagedType Värde |
Encoding |
---|---|
LPStr | ANSI |
LPUTF8Str | UTF-8 |
LPWStr | UTF-16 |
LPTStr | UTF-16 |
Formatet UnmanagedType.VBByRefStr är något annorlunda. Precis som LPWStr
, konverteras strängen till en inbyggd C-sträng som kodas i UTF-16. Men den hanterade signaturen får du skicka in strängen efter referens och den matchande interna signaturen tar strängen efter värde. Med den här skillnaden kan du använda ett internt API som tar en sträng efter värde och ändrar den på plats utan att behöva använda en StringBuilder
. Vi rekommenderar att du inte använder det här formatet manuellt eftersom det kan orsaka förvirring med inbyggda och hanterade signaturer som inte matchar.
Windows-centrerat strängformat
När du interagerar med COM- eller OLE-gränssnitt upptäcker du förmodligen att de inbyggda funktionerna använder strängar som BSTR
argument. Du kan använda den UnmanagedType.BStr ohanterade typen för att konvertera en sträng som en BSTR
.
Om du interagerar med WinRT-API:er kan du använda UnmanagedType.HString formatet för att konvertera en sträng som en HSTRING
.
Anpassa matrisparametrar
.NET tillhandahåller också flera sätt att konvertera matrisparametrar. Om du anropar ett API som tar en matris i C-stil använder du den UnmanagedType.LPArray ohanterade typen. Om värdena i matrisen behöver anpassad marshalling kan du använda fältet ArraySubType för [MarshalAs]
attributet för det.
Om du använder COM-API:er måste du förmodligen konvertera matrisparametrarna som SAFEARRAY*
de är. Om du vill göra det kan du använda den UnmanagedType.SafeArray ohanterade typen. Standardtypen för elementen SAFEARRAY
i kan visas i tabellen för att object
anpassa fält. Du kan använda fälten MarshalAsAttribute.SafeArraySubType och MarshalAsAttribute.SafeArrayUserDefinedSubType för att anpassa den exakta elementtypen för SAFEARRAY
.
Anpassa booleska parametrar eller decimalparametrar
Information om hur du samlar booleska parametrar eller decimalparametrar finns i Anpassa strukturrappning.
Anpassa objektparametrar (endast Windows)
I Windows tillhandahåller .NET-körningen ett antal olika sätt att konvertera objektparametrar till intern kod.
Marshalling som specifika COM-gränssnitt
Om ditt API tar en pekare till ett COM-objekt kan du använda något av följande UnmanagedType
format på en object
-typed-parameter för att be .NET att konvertera som dessa specifika gränssnitt:
IUnknown
IDispatch
IInspectable
Om din typ är markerad [ComVisible(true)]
eller om du sorterar object
typen kan du dessutom använda UnmanagedType.Interface formatet för att konvertera objektet som en COM-anropsbar omslutning för COM-vyn av din typ.
Marshalling till en VARIANT
Om ditt interna API tar en Win32 VARIANT
kan du använda UnmanagedType.Struct formatet på parametern object
för att konvertera dina objekt som VARIANT
s. Se dokumentationen om hur du anpassar object
fält för en mappning mellan .NET-typer och VARIANT
-typer.
Anpassade marshallers
Om du vill projicera ett inbyggt COM-gränssnitt i en annan hanterad typ kan du använda UnmanagedType.CustomMarshaler
formatet och en implementering av ICustomMarshaler för att tillhandahålla din egen anpassade marshallingkod.