Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ě generovaná interoperabilita pro P/Invokes a COM respektuje pouze malou podmnožinu MarshalAsAttribute u parametrů. Místo toho se doporučuje použít MarshalUsingAttribute pro zdrojově vygenerovanou interoperabilitu. Další informace naleznete v tématu Vlastní zprostředkování pro generování zdrojového kódu.
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 hodnota |
Encoding |
|---|---|
| LPStr | organizace 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 C-řetězce zakódovaného v UTF-16. Spravovaný podpis však předává řetězec odkazem a odpovídající nativní podpis přebírá řetězec jako hodnotu. 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. Nedoporučujeme ručně používat tento formát, protože může způsobit nejasnosti kvůli neshodě 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 UnmanagedType.BStr můžete použít k zařazování řetězce jako BSTR.
Pokud pracujete s rozhraními API WinRT, můžete použít formát UnmanagedType.HString k zařazení řetězce jako HSTRING.
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 jazyka 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 předat parametry pole jako SAFEARRAY*. K tomu můžete použít UnmanagedType.SafeArray nespravovaný typ. Výchozí typ prvků SAFEARRAY lze najít v tabulce přizpůsobení object polí. Pole MarshalAsAttribute.SafeArraySubType a MarshalAsAttribute.SafeArrayUserDefinedSubType můžete použít k přizpůsobení přesného typu prvku 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í COM
Pokud vaše rozhraní API vezme ukazatel na objekt COM, můžete u parametru typu object použít některý z následujících formátů UnmanagedType, aby rozhraní .NET zařadilo jako tato konkrétní rozhraní.
IUnknownIDispatchIInspectable
Kromě toho, pokud je váš typ označený [ComVisible(true)] nebo připravujete typ object, můžete použít formát UnmanagedType.Interface pro zabalení vašeho objektu jako volatelnou obálku pro zobrazení modelu COM vašeho typu.
Přenos na VARIANT
Pokud vaše nativní rozhraní API používá Win32VARIANT, můžete u parametru object použít UnmanagedType.Struct formát pro přenášení objektů jako VARIANT. Viz dokumentaci o přizpůsobení object polí pro mapování mezi typy .NET a VARIANT typy.
Vlastní marshallery
Pokud chcete zobrazit nativní rozhraní COM do jiného spravovaného typu, můžete použít implementaci a formát UnmanagedType.CustomMarshaler pro poskytování vlastního ICustomMarshaler převodu kódu.