Anpassen des Marshallings für Parameter

Wenn das standardmäßige Marshalling-Verhalten für Parameter nicht wie erwünscht funktioniert, können Sie mithilfe des Attributs System.Runtime.InteropServices.MarshalAsAttribute anpassen, wie Ihre Parameter gemarshallt 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 MarshalUsingAttribute für die von der Quelle generierte Interoperabilität zu verwenden. Weitere Informationen finden Sie unter Benutzerdefiniertes Marshalling für die Quellgenerierung.

Anpassen von Zeichenfolgenparametern

.NET bietet eine Vielzahl von Formaten zum Marshallen von Zeichenfolgen. Diese Methoden werden in unterschiedliche Abschnitte für Zeichenfolgen im C-Stil und für Windows-orientierte Zeichenfolgenformate aufgeteilt.

Zeichenfolgen im C-Stil

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

System.Runtime.InteropServices.UnmanagedType-Wert Codierung
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

Das UnmanagedType.VBByRefStr-Format ist etwas anders. Genauso wie LPWStr marshallt es die Zeichenfolge in eine native C-Stil-Zeichenfolge, 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. Diese Unterscheidung ermöglicht es Ihnen, eine native API zu verwenden, die eine Zeichenfolge nach Wert übernimmt und an Ort und Stelle ändert, ohne einen StringBuilder verwenden zu müssen. Wir empfehlen, dieses Format nicht manuell zu verwenden, da es zu Verwechslungen mit den nicht übereinstimmenden nativen und verwalteten Signaturen führen kann.

Windows-orientierte Zeichenfolgenformate

Wenn Sie mit COM- oder OLE-Schnittstellen interagieren, werden Sie wahrscheinlich feststellen, dass die nativen 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 Format UnmanagedType.HString verwenden, um eine Zeichenfolge als HSTRING marshallen.

Anpassen von Arrayparametern

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

Wenn Sie COM-APIs verwenden, müssen Sie Ihre Arrayparameter wahrscheinlich als SAFEARRAY* marshallen. Dafür können Sie den nicht verwalteten Typ UnmanagedType.SafeArray verwenden. Der Standardtyp der Elemente von SAFEARRAY werden in der Tabelle in den Feldern Anpassenobject angezeigt. 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 Marshallen boolescher oder dezimaler Parameter finden Sie unter Anpassen des Marshalling für Strukturen.

Anpassen der Objektparameter (nur Windows)

Unter Windows bietet die.NET-Runtime eine Reihe von verschiedenen Möglichkeiten zum Marshallen von Objektparametern in nativen Code.

Marshallen als bestimmte COM-Schnittstellen

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 Format UnmanagedType.CustomMarshaler und eine Implementierung von ICustomMarshaler verwenden, um Ihren eigenen benutzerdefinierten Marshallingcode bereitzustellen.