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 LPWStr
zař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 HSTRING
použí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 object
typu -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 VARIANT
objektů 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.