Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När .NET-runtime:ns standardparameterhanteringsbeteende inte gör vad du vill kan du använda System.Runtime.InteropServices.MarshalAsAttribute-attributet för att anpassa hur dina parametrar hanteras. De här anpassningsfunktionerna gäller inte när runtime-marshalling inaktiveras.
Anmärkning
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 marshalling-strängar. Dessa metoder är uppdelade i distinkta avsnitt om C-stil strängar och Windows-centrerade strängformat.
C-formatsträngar
Vart och ett av dessa format skickar en null-avslutad sträng till intern kod. De skiljer sig åt genom kodningen av den ursprungliga strängen.
System.Runtime.InteropServices.UnmanagedType värde |
Kodning |
|---|---|
| LPStr | ANSI (American National Standards Institute) |
| LPUTF8Str | UTF-8 |
| LPWStr | UTF-16 |
| LPTStr | UTF-16 |
Formatet UnmanagedType.VBByRefStr är något annorlunda. Precis som LPWStr, omvandlas strängen till en inbyggd C-sträng som är kodad i UTF-16. Men den hanterade signaturen får dig att skicka in strängen som referens och den matchande inbyggda signaturen tar strängen som värde. Med denna distinktion kan du använda ett native API som tar en sträng som värde och ändrar den direkt 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änd den UnmanagedType.LPArray ohanterade typen. Om värdena i matrisen behöver anpassad marshalling kan du använda fältet ArraySubType på attributet [MarshalAs] för detta syfte.
Om du använder COM-API:er måste du förmodligen marshala matrisparametrarna som SAFEARRAY*s. Om du vill göra det kan du använda den UnmanagedType.SafeArray ohanterade typen. Standardtypen för elementen i SAFEARRAY kan ses i tabellen vid anpassning av object 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 hanterar booleska eller decimalparametrar finns i Anpassa strukturhantering.
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 parameter med typen object för att instruera .NET att lägga om till dessa specifika gränssnitt.
IUnknownIDispatchIInspectable
Om din typ är markerad [ComVisible(true)] eller om du hanterar object typen kan du dessutom använda UnmanagedType.Interface formatet för att skapa ditt objekt som en COM-anropsbar omslutning för COM-vyn av din typ.
Samordning till en VARIANT
Om ditt interna API tar en Win32 VARIANT, kan du använda formatet UnmanagedType.Struct på din object-parameter för att serialisera dina objekt som VARIANTs. 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.