Přizpůsobení zařazování parametrů

Pokud výchozí chování zařazování parametrů modulu runtime .NET nedělá to, co chcete, můžete pomocí atributu System.Runtime.InteropServices.MarshalAsAttribute přizpůsobit způsob zařazování parametrů. Tyto funkce přizpůsobení se nevztahují při zakázání zařazování za běhu.

Poznámka:

Zdrojově vygenerovaná interoperabilita pro volání nespravovaných položek a com respektuje pouze malou podmnožinu MarshalAsAttribute parametrů. Místo toho se doporučuje použít MarshalUsingAttribute pro zdrojově vygenerovanou interoperabilitu. Další informace naleznete v tématu Vlastní zařazování pro generování zdrojů.

Přizpůsobení parametrů řetězce

.NET má různé formáty pro zařazování řetězců. Tyto metody jsou rozděleny do různých oddílů u řetězců ve stylu jazyka C a formátech řetězců orientovaných na Windows.

Řetězce ve stylu jazyka C

Každý z těchto formátů předává do nativního kódu řetězec ukončený hodnotou null. Liší se kódováním nativního řetězce.

System.Runtime.InteropServices.UnmanagedType Hodnotu Kódování
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
Lptstr UTF-16

Formát UnmanagedType.VBByRefStr se mírně liší. Podobně jako LPWStrzařadí řetězec do nativního řetězce ve stylu C zakódovaný v UTF-16. Spravovaný podpis však předává řetězec odkazem a odpovídající nativní podpis přebírá řetězec podle hodnoty. Toto rozlišení umožňuje použít nativní rozhraní API, které přebírá řetězec podle hodnoty a upravuje ho na místě, aniž byste museli použít StringBuilder. Doporučujeme ručně použít tento formát, protože je náchylný k nejasnostem s neshodou nativních a spravovaných podpisů.

Formáty řetězců zaměřené na Windows

Při interakci s rozhraními COM nebo OLE pravděpodobně zjistíte, že nativní funkce přebírají řetězce jako BSTR argumenty. Nespravovaný typ můžete použít UnmanagedType.BStr k zařazování řetězce jako řetězce BSTR.

Pokud pracujete s rozhraními API WinRT, můžete k zařazování řetězce jako řetězce HSTRINGpoužít UnmanagedType.HString formát .

Přizpůsobení parametrů pole

.NET také poskytuje několik způsobů zařazování parametrů pole. Pokud voláte rozhraní API, které přebírá pole ve stylu C, použijte UnmanagedType.LPArray nespravovaný typ. Pokud hodnoty v poli potřebují přizpůsobené zařazování, můžete pro tento atribut použít ArraySubType pole [MarshalAs] .

Pokud používáte rozhraní COM API, budete pravděpodobně muset zařaďte parametry pole jako SAFEARRAY*parametry. K tomu můžete použít UnmanagedType.SafeArray nespravovaný typ. Výchozí typ prvků prvků tabulky SAFEARRAY lze zobrazit v tabulce při přizpůsobení object polí. Pole a MarshalAsAttribute.SafeArrayUserDefinedSubType pole můžete použít MarshalAsAttribute.SafeArraySubType k přizpůsobení přesného typu prvku objektu SAFEARRAY.

Přizpůsobení logických nebo desetinných parametrů

Informace o zařazování logických nebo desetinných parametrů naleznete v tématu Přizpůsobení zařazování struktury.

Přizpůsobení parametrů objektu (pouze Windows)

Modul runtime .NET ve Windows poskytuje řadu různých způsobů zařazování parametrů objektu do nativního kódu.

Zařazování jako konkrétních rozhraní MODELU COM

Pokud vaše rozhraní API vezme ukazatel na objekt MODELU COM, můžete u parametru objecttypu -typed použít některý z následujících UnmanagedType formátů, aby rozhraní .NET zařazoval jako tato konkrétní rozhraní:

  • IUnknown
  • IDispatch
  • IInspectable

Kromě toho, pokud je váš typ označený [ComVisible(true)] nebo zařazujete object typ, můžete použít UnmanagedType.Interface formát pro zařazování objektu jako obálku volatelného modelu COM pro zobrazení modelu COM vašeho typu.

Zařazování na VARIANT

Pokud vaše nativní rozhraní API používá Win32VARIANT, můžete k zařazování objektů jako VARIANTobjektů použít UnmanagedType.Struct formát parametruobject. Viz dokumentace k přizpůsobení object polí pro mapování mezi typy a VARIANT typy .NET.

Vlastní marshallery

Pokud chcete projektovat nativní rozhraní MODELU COM do jiného spravovaného typu, můžete použít UnmanagedType.CustomMarshaler formát a implementaci k poskytnutí vlastního ICustomMarshaler zařazování kódu.