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 VARIANTs. 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.