Freigeben über


Parameterübertragung anpassen

Wenn das Standard-Marshalverhalten der .NET-Runtime nicht das gewünschte Verhalten bietet, können Sie das System.Runtime.InteropServices.MarshalAsAttribute-Attribut verwenden, um zu bestimmen, wie Ihre Parameter marshallt werden. Diese Anpassungsfunktionen gelten nicht, wenn das Runtime-Marshalling deaktiviert ist.

Hinweis

Von der Quelle generierte Interoperabilität für P/Invokes und COM berücksichtigt nur eine kleine Teilmenge von MarshalAsAttribute-Parametern. Es wird empfohlen, stattdessen für die quellgenerierte Interoperabilität zu verwenden MarshalUsingAttribute . Weitere Informationen finden Sie unter "Benutzerdefiniertes Marshalling für die Quellgenerierung".

Anpassen von Zeichenfolgenparametern

.NET bietet verschiedene Formate für das Übertragen von Zeichenfolgen. Diese Methoden werden in unterschiedliche Abschnitte in C-Stil-Zeichenfolgen und Windows-zentrierten Zeichenfolgenformaten unterteilt.

Zeichenfolgen im C-Stil

Jedes dieser Formate übergibt eine null-terminierte Zeichenkette an den nativen Code. Sie unterscheiden sich in der Kodierung der nativen Zeichenfolge.

System.Runtime.InteropServices.UnmanagedType-Wert Codierung
LPStr ANSI (Amerikanisches Institut für Normung)
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

Das UnmanagedType.VBByRefStr Format unterscheidet sich geringfügig. Wie LPWStr wandelt er die Zeichenfolge in eine native C-Format-Zeichenkette um, die in UTF-16 codiert ist. Die verwaltete Signatur lässt Sie jedoch die Zeichenfolge nach Referenz übergeben und die passende native Signatur übernimmt die Zeichenfolge nach Wert. Mit dieser Unterscheidung können Sie eine systemeigene API verwenden, die eine Zeichenfolge als Wert annimmt und sie direkt verändert, ohne eine StringBuilder Zeichenfolge verwenden zu müssen. Es wird empfohlen, dieses Format nicht manuell zu verwenden, da es leicht zu Verwirrung mit unpassenden nativen und verwalteten Signaturen führen kann.

Windows-zentrierte Zeichenfolgenformate

Wenn Sie mit COM- oder OLE-Schnittstellen interagieren, stellen Sie wahrscheinlich fest, dass die systemeigenen Funktionen Zeichenfolgen als BSTR Argumente verwenden. Sie können den nicht verwalteten Typ UnmanagedType.BStr verwenden, um eine Zeichenfolge als BSTR zu marshallen.

Wenn Sie mit WinRT-APIs interagieren, können Sie das UnmanagedType.HString-Format verwenden, um eine Zeichenfolge als HSTRING zu marshallen.

Anpassen von Arrayparametern

.NET bietet Ihnen auch mehrere Möglichkeiten zum Marshallen von Arrayparametern. Wenn Sie eine API aufrufen, die ein Array im C-Stil verwendet, verwenden Sie den UnmanagedType.LPArray nicht verwalteten Typ. Wenn die Werte im Array ein angepasstes Marshalling benötigen, können Sie das ArraySubType Feld des [MarshalAs] Attributs dafür verwenden.

Wenn Sie COM-APIs verwenden, müssen Sie Ihre Arrayparameter wahrscheinlich als SAFEARRAY* marshallen. Dazu können Sie den UnmanagedType.SafeArray nicht verwalteten Typ verwenden. Der Standardtyp der Elemente von SAFEARRAY kann in der Tabelle zu benutzerdefinierten object-Feldern gesehen werden. Sie können die Felder MarshalAsAttribute.SafeArraySubType und MarshalAsAttribute.SafeArrayUserDefinedSubType verwenden, um den genauen Elementtyp von SAFEARRAY anzupassen.

Anpassen von booleschen oder dezimalen Parametern

Informationen zum Marshalling boolescher oder dezimaler Parameter finden Sie unter Anpassen der Struktur-Marshalling.

Anpassen von Objektparametern (nur Windows)

Unter Windows bietet die .NET-Laufzeit eine Reihe verschiedener Methoden zum Marshallen von Objektparametern für systemeigenen Code.

Marshalling als spezifische COM-Schnittstellen verwenden

Wenn Ihre API einen Zeiger auf ein COM-Objekt übernimmt, können Sie eines der folgenden UnmanagedType-Formate auf einem object-typisierten Parameter verwenden, damit .NET als diese spezifischen Schnittstellen marshallt.

  • IUnknown
  • IDispatch
  • IInspectable

Wenn Ihr Typ außerdem mit [ComVisible(true)] markiert ist oder Sie den Typ object marshallen, können Sie das Format UnmanagedType.Interface verwenden, um Ihr Objekt als COM COM Callable Wrapper für die COM-Ansicht Ihres Typs darzustellen.

Marshallen in eine VARIANT

Wenn Ihre native API eine Win32-VARIANT verwendet, können Sie das UnmanagedType.Struct-Format für Ihren object-Parameter verwenden, um Ihre Objekte als VARIANT zu marshallen. Informationen zur Zuordnung zwischen .NET-Typen und VARIANT-Typen finden Sie in der Dokumentation zum Anpassen von object-Feldern.

Benutzerdefinierte Marshaller

Wenn Sie eine native COM-Schnittstelle in einen anderen verwalteten Typ projizieren möchten, können Sie das UnmanagedType.CustomMarshaler Format und eine Implementierung von ICustomMarshaler verwenden, um Ihren eigenen benutzerdefinierten Marshalling-Code bereitzustellen.