Dela via


Anpassa parameterr marshalling

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.

  • IUnknown
  • IDispatch
  • IInspectable

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.