Paraméter-rendezés testreszabása
Ha a .NET-futtatókörnyezet alapértelmezett paraméter-rendezési viselkedése nem azt teszi, amit szeretne, az System.Runtime.InteropServices.MarshalAsAttribute attribútum használatával testre szabhatja a paraméterek rendezési módját. Ezek a testreszabási funkciók nem érvényesek, ha a futtatókörnyezet-rendezés le van tiltva.
Feljegyzés
A P/Invokes és a COM forrás által létrehozott interopja csak a paraméterek egy kis részhalmazát MarshalAsAttribute tartja tiszteletben. Javasoljuk, hogy inkább a forrás által létrehozott interophoz használja MarshalUsingAttribute . További információ: Egyéni rendezés a forrásgeneráláshoz.
Sztringparaméterek testreszabása
A .NET számos formátumot tartalmaz a sztringek rendezéshez. Ezek a metódusok különböző szakaszokra vannak felosztva a C-stílusú sztringeken és a Windows-központú sztringformátumokon.
C stílusú sztringek
Mindegyik formátum null értékű sztringet ad át a natív kódnak. Ezek különböznek a natív sztring kódolásától.
System.Runtime.InteropServices.UnmanagedType Érték |
Kódolás |
---|---|
LPStr | ANSI |
LPUTF8Str | UTF-8 |
LPWStr | UTF-16 |
LPTStr | UTF-16 |
A UnmanagedType.VBByRefStr formátum kissé eltérő. Ehhez hasonlóan LPWStr
a sztringet egy natív, UTF-16-ban kódolt C-stílusú sztringre rögzíti. A felügyelt aláírás azonban hivatkozással adja át a sztringet, és az egyező natív aláírás érték szerint veszi át a sztringet. Ez a különbségtétel lehetővé teszi, hogy natív API-t használjon, amely érték szerint vesz fel egy sztringet, és helyben módosítja azt anélkül, hogy egy StringBuilder
. Javasoljuk, hogy manuálisan használja ezt a formátumot, mivel ez hajlamos zavart okozni a natív és a felügyelt aláírások nem egyezőségével.
Windows-központú sztringformátumok
A COM- vagy OLE-felületek használatakor valószínűleg azt fogja tapasztalni, hogy a natív függvények argumentumként BSTR
sztringeket használnak. A nem felügyelt típussal UnmanagedType.BStr sztringeket BSTR
hozhat létre.
Ha WinRT API-kat használ, a UnmanagedType.HString formátum használatával sztringeket HSTRING
hozhat létre.
Tömbparaméterek testreszabása
A .NET több módszert is kínál a tömbparaméterek beállítására. Ha C stílusú tömböt használó API-t hív meg, használja a UnmanagedType.LPArray nem felügyelt típust. Ha a tömb értékeinek testre szabott rendezést kell alkalmazniuk, használhatja az ArraySubType[MarshalAs]
attribútum mezőjét.
COM API-k használata esetén valószínűleg a tömbparamétereket kell s-ként SAFEARRAY*
használnia. Ehhez használhatja a UnmanagedType.SafeArray nem felügyelt típust. Az elemek alapértelmezett típusa a SAFEARRAY
mezők testreszabását object
tartalmazó táblázatban látható. A mezőkkel MarshalAsAttribute.SafeArraySubTypeMarshalAsAttribute.SafeArrayUserDefinedSubType testre szabhatja a pontos elemtípust SAFEARRAY
.
Logikai vagy decimális paraméterek testreszabása
A logikai vagy decimális paraméterek rendezésével kapcsolatos információkért lásd a struktúra-rendezés testreszabását ismertető témakört.
Objektumparaméterek testreszabása (csak Windows rendszeren)
Windows rendszeren a .NET-futtatókörnyezet számos különböző módot kínál az objektumparaméterek natív kódba való beállítására.
Rendezés meghatározott COM-interfészként
Ha az API egy COM-objektumra mutató mutatót használ, a következő UnmanagedType
formátumok bármelyikét használhatja egy object
-typed paraméteren, hogy a .NET-et a következő interfészekként adja meg:
IUnknown
IDispatch
IInspectable
Ezenkívül ha a típus meg van jelölve [ComVisible(true)]
, vagy a típust rendezi object
, a UnmanagedType.Interface formátum használatával az objektumot com-hívó burkolóként helyezheti el a típus COM-nézetéhez.
Rendezés VARIANT
Ha a natív API Win32-t VARIANT
használ, akkor a UnmanagedType.Struct paraméter formátumával object
az objektumokat s-ként VARIANT
helyezheti el. Tekintse meg a mezők testreszabásával object
kapcsolatos dokumentációt a .NET-típusok és VARIANT
-típusok közötti leképezéshez.
Egyéni rendezők
Ha egy natív COM-felületet más felügyelt típusba szeretne kivetíteniICustomMarshaler, a formátumot és a UnmanagedType.CustomMarshaler
megvalósítást használhatja saját egyéni rendezési kód megadásához.