Paraméter-szerializáció 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ási idő alatti adatátalakítás le van tiltva.

Megjegyzé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 csatornázás a forrásgeneráláshoz.

Sztringparaméterek testreszabása

A .NET számos formátumot kínál a sztringek átvitelére. 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ú karakterláncok

Mindegyik formátum nullával lezárt 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 Encoding
LPStr ANSI
LPUTF8Str UTF-8
LPWStr UTF-16
LPTStr UTF-16

A UnmanagedType.VBByRefStr formátum kissé eltérő. Ehhez hasonlóan LPWStr, a karakterláncot egy natív, UTF-16-ban kódolt C-stílusú karakterláncra alakítja. 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 megkülönböztetés lehetővé teszi, hogy olyan natív API-t használjon, amely egy sztringet értékként visz be és helyben módosít anélkül, hogy StringBuilder-t használna. Nem javasoljuk, hogy manuálisan használja ezt a formátumot, mivel ez zavart okozhat a natív és a felügyelt aláírások nem egyezősége miatt.

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 UnmanagedType.BStr nem felügyelt típus használatával egy sztringet BSTR típusként marsholhat.

Ha WinRT API-kat használ, a UnmanagedType.HString formátum segítségével sztringeket HSTRING formátumba ágyazhat.

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ömbben lévő értékeken testreszabott marshallingot kell alkalmazni, használhatja az ArraySubType[MarshalAs] attribútum mezőjét.

Ha COM API-kat használ, valószínűleg a tömbparamétereit SAFEARRAY*-ként kell kezelnie. Ehhez használhatja a UnmanagedType.SafeArray nem felügyelt típust. Az elemek alapértelmezett típusa a SAFEARRAYmezők testreszabását objecttartalmazó táblázatban látható. A MarshalAsAttribute.SafeArraySubType és MarshalAsAttribute.SafeArrayUserDefinedSubType mezőkkel testre szabhatja az elem pontos típusát 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.

Adatcsomagolás specifikus COM-interfészként

Ha az API egy COM-objektumra mutató pointert használ, a következő UnmanagedType formátumok bármelyikét használhatja egy object-típusú paraméteren, hogy a .NET úgy adja át, mint ezek az interfészek.

  • IUnknown
  • IDispatch
  • IInspectable

Ezenkívül, ha a típus meg van jelölve [ComVisible(true)], vagy a object típus kódolására kerül sor, a UnmanagedType.Interface formátum használatával az objektumot COM-hívó burkolóként jelenítheti meg a típus COM-nézetéhez.

Sorba rendezése VARIANT

Ha a natív API Win32 VARIANT-t használ, akkor a UnmanagedType.Struct formátumot alkalmazhatja a object paraméteren, hogy az objektumokat VARIANT-ként kezelje. 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 szerializálók

Ha egy natív COM-felületet más felügyelt típusba szeretne kivetíteni, használhatja a UnmanagedType.CustomMarshaler formátumot és a ICustomMarshaler megvalósítást saját egyéni marshalling kód megadásához.