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.