Dostosowywanie marshalingu parametrów
Gdy domyślne zachowanie marshaling parametru środowiska uruchomieniowego platformy .NET nie robi tego, co chcesz, użyj atrybutu System.Runtime.InteropServices.MarshalAsAttribute , aby dostosować sposób działania parametrów. Te funkcje dostosowywania nie mają zastosowania, gdy marshalling środowiska uruchomieniowego jest wyłączony.
Uwaga
Międzyoperacyjna wygenerowana przez źródło dla parametrów P/Invoke i COM uwzględnia tylko niewielki podzbiór parametrów MarshalAsAttribute . Zaleca się zamiast tego użycie MarshalUsingAttribute w przypadku międzyoperacjności generowanej przez źródło. Aby uzyskać więcej informacji, zobacz Niestandardowe marshalling dla generowania źródła.
Dostosowywanie parametrów ciągu
Platforma .NET ma różne formaty dla ciągów marshalingowych. Te metody są podzielone na odrębne sekcje w ciągach w stylu C i formatach ciągów skoncentrowanych na systemie Windows.
Ciągi w stylu C
Każdy z tych formatów przekazuje ciąg o wartości null do kodu natywnego. Różnią się one kodowaniem ciągu natywnego.
System.Runtime.InteropServices.UnmanagedType Wartość |
Kodowanie |
---|---|
Lpstr | ANSI |
LPUTF8Str | UTF-8 |
Lpwstr | UTF-16 |
LPTStr | UTF-16 |
Format UnmanagedType.VBByRefStr jest nieco inny. Podobnie jak LPWStr
, wykonuje marshaling ciągu do natywnego ciągu w stylu C zakodowanego w formacie UTF-16. Jednak podpis zarządzany przekazuje ciąg według odwołania, a pasujący podpis natywny przyjmuje ciąg według wartości. To rozróżnienie umożliwia użycie natywnego interfejsu API, który przyjmuje ciąg według wartości i modyfikuje go w miejscu bez konieczności używania elementu StringBuilder
. Zalecamy ręczne używanie tego formatu, ponieważ podatne jest na nieporozumienie z niezgodnością sygnatur natywnych i zarządzanych.
Formaty ciągów skoncentrowanych na systemie Windows
Podczas interakcji z interfejsami COM lub OLE prawdopodobnie okaże się, że funkcje natywne przyjmują ciągi jako BSTR
argumenty. Możesz użyć UnmanagedType.BStr typu niezarządzanego do marshalingu ciągu jako .BSTR
Jeśli korzystasz z interfejsów API WinRT, możesz użyć UnmanagedType.HString formatu do marshalingu ciągu jako .HSTRING
Dostosowywanie parametrów tablicy
Platforma .NET udostępnia również wiele sposobów marshalingu parametrów tablicy. Jeśli wywołujesz interfejs API, który przyjmuje tablicę w stylu C, użyj UnmanagedType.LPArray typu niezarządzanego. Jeśli wartości w tablicy wymagają dostosowania marshalingu, możesz użyć ArraySubType pola w atrybucie [MarshalAs]
.
Jeśli używasz interfejsów API modelu COM, prawdopodobnie będzie konieczne przeprowadzanie marshalingu parametrów tablicy jako SAFEARRAY*
s. W tym celu można użyć UnmanagedType.SafeArray typu niezarządzanego. Domyślny typ elementów tabeli SAFEARRAY
można zobaczyć w tabeli dotyczącej dostosowywania object
pól. Możesz użyć MarshalAsAttribute.SafeArraySubType pól iMarshalAsAttribute.SafeArrayUserDefinedSubType, aby dostosować dokładny typ elementu .SAFEARRAY
Dostosowywanie parametrów logicznych lub dziesiętnych
Aby uzyskać informacje na temat marshalingu parametrów logicznych lub dziesiętnych, zobacz Dostosowywanie marshalingu struktury.
Dostosowywanie parametrów obiektu (tylko system Windows)
W systemie Windows środowisko uruchomieniowe platformy .NET udostępnia wiele różnych sposobów marshalingu parametrów obiektu do kodu natywnego.
Marshalling jako określone interfejsy COM
Jeśli interfejs API przyjmuje wskaźnik do obiektu COM, możesz użyć dowolnego z następujących UnmanagedType
formatów w object
-typed parametru, aby poinformować platformę .NET o marshalingu jako tych konkretnych interfejsów:
IUnknown
IDispatch
IInspectable
Ponadto, jeśli typ jest oznaczony [ComVisible(true)]
lub typ jest przeznaczony do pisania object
, możesz użyć UnmanagedType.Interface formatu do marshalingu obiektu jako otoki wywołującej com dla widoku COM typu.
Marshalling do a VARIANT
Jeśli natywny interfejs API przyjmuje win32 VARIANT
, możesz użyć UnmanagedType.Struct formatu w object
parametrze , aby przeprowadzić marshaling obiektów jako VARIANT
s. Zapoznaj się z dokumentacją dotyczącą dostosowywania pól do mapowania object
między typami i VARIANT
typami platformy .NET.
Marshallers niestandardowe
Jeśli chcesz projektować natywny interfejs COM w innym typie zarządzanym, możesz użyć UnmanagedType.CustomMarshaler
formatu i implementacji w celu udostępnienia własnego niestandardowego ICustomMarshaler kodu marshalingu.