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 VARIANTkan du använda UnmanagedType.Struct formatet på parametern object för att konvertera 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.