Megosztás a következőn keresztül:


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 LPWStra 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 BSTRhozhat létre.

Ha WinRT API-kat használ, a UnmanagedType.HString formátum használatával sztringeket HSTRINGhozhat 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 VARIANThasznál, akkor a UnmanagedType.Struct paraméter formátumával object az objektumokat s-ként VARIANThelyezheti 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.