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


Másolás és rögzítés

Az adatok rendezésekor az interop-rendező kimásolhatja vagy rögzítheti a rendezés alatt álló adatokat. Az adatok másolása az egyik memóriahelyről egy másik memóriahelyre helyezi az adatok másolatát. Az alábbi ábrán egy értéktípus másolása és a felügyelt memóriából a nem felügyelt memóriába való hivatkozással átadott típus másolása közötti különbségek láthatók.

Diagram that shows how value and reference types are copied.

Az érték által átadott metódusargumentumok nem felügyelt kódra vannak rendezve a verem értékeiként. A másolási folyamat közvetlen. A hivatkozás által átadott argumentumok a verem mutatóiként lesznek átadva. A referenciatípusok érték és hivatkozás alapján is átadhatók. Ahogy az alábbi ábrán látható, az érték által átadott referenciatípusok másolása vagy rögzítése:

Diagram showing reference types passed by value and by reference.

A rögzítés ideiglenesen zárolja az adatokat az aktuális memóriahelyén, így nem helyezi át őket a közös nyelvi futtatókörnyezet szemétgyűjtője. A rendező rögzíti az adatokat a másolás többletterhelésének csökkentése és a teljesítmény növelése érdekében. Az adatok típusa határozza meg, hogy a rendszer átmásolja vagy rögzítve van-e a rendezési folyamat során. A rögzítés automatikusan megtörténik a rendezés során olyan objektumok esetében, mint Stringpéldául a memória rögzítése, de manuálisan is rögzítheti a memóriát az GCHandle osztály használatával.

Formázott hasábosztályok

A formázott oszlopos osztályok rögzített elrendezéssel (formázott) és közös adatábrázolással rendelkeznek mind a felügyelt, mind a nem felügyelt memóriában. Ha ezek a típusok rendezést igényelnek, a halomban lévő objektum mutatója közvetlenül a hívónak lesz átadva. A hívó módosíthatja az egérmutató által hivatkozott memóriahely tartalmát.

Feljegyzés

A hívó módosíthatja a memória tartalmát, ha a paraméter kifelé vagy kimenőre van jelölve. Ezzel szemben a hívónak kerülnie kell a tartalom módosítását, ha a paramétert in értékre állítja, ami a formázott hasábos típusok alapértelmezett értéke. Az In objektum módosítása problémákat okoz, ha ugyanazt az osztályt exportálják egy típustárba, és lakásközi hívások indítására használják.

Formázott nem titkos osztály

A formázott nem félkonfigurált osztályok elrendezése rögzített (formázott), de az adatábrázolás a felügyelt és a nem felügyelt memóriában eltérő. Az adatok a következő feltételek mellett igényelhetnek átalakítást:

  • Ha egy nem titkos osztály értéke rendezve van, a hívó egy mutatót kap az adatstruktúra másolatához.

  • Ha egy nem titkos osztály hivatkozással van rendezve, a hívó egy mutatót kap az adatstruktúra másolatára.

  • Ha az InAttribute attribútum be van állítva, a másolat mindig inicializálva lesz a példány állapotával, szükség szerint rendezve.

  • Ha az OutAttribute attribútum be van állítva, a rendszer mindig visszamásolja az állapotot a példányra a visszatéréskor, szükség szerint rendezve.

  • Ha az InAttribute és az OutAttribute is be van állítva, mindkét példányra szükség van. Ha egyik attribútumot sem adja meg, a rendező a másolás eltávolításával optimalizálhat.

Referenciatípusok

A referenciatípusok átadhatók érték vagy hivatkozás alapján. Ha érték alapján adja át őket, a verem a típusra mutató mutatót ad át. Ha hivatkozással adja át, a verem egy mutatót ad át a típushoz.

A referenciatípusok a következő feltételes viselkedést hajtják végre:

  • Ha egy referenciatípust érték ad át, és nem titkos típusok tagjai vannak, a típusok kétszer lesznek konvertálva:

    • Amikor argumentumot ad át a nem felügyelt oldalnak.

    • Vissza a hívásból.

    A szükségtelen másolás és átalakítás elkerülése érdekében ezeket a típusokat in paraméterként rendezi a rendszer. Az InAttribute és az OutAttribute attribútumokat explicit módon kell alkalmaznia a hívó argumentumára a hívó által végrehajtott módosítások megtekintéséhez.

  • Ha egy referenciatípust érték ad át, és csak a titkos típusok tagjaival rendelkezik, rögzíthető a rendezés során, és a hívó láthatja a hívó által a típus tagjainak módosításait. Ha ezt a viselkedést szeretné, alkalmazza az InAttribute és az OutAttribute parancsot. Ezek nélkül az iránytulajdonságok nélkül az interop marshaller nem exportálja az irányadatokat a típustárba (ez az alapértelmezett in értékként exportálja), és ez problémákat okozhat a COM lakásközi rendezéssel kapcsolatban.

  • Ha egy referenciatípust hivatkozással ad át, a rendszer alapértelmezés szerint in/out értékre rendezi a referenciatípust.

System.String és System.Text.StringBuilder

Ha az adatokat nem felügyelt kódra rendezik érték vagy hivatkozás alapján, a rendező általában egy másodlagos pufferbe másolja az adatokat (esetleg a másolás során átalakítja a karakterkészleteket), és átadja a pufferre mutató hivatkozást a hívónak. Hacsak a hivatkozás nem a SysAllocStringgel lefoglalt BSTR, a hivatkozás mindig a CoTaskMemAlloc-tal van lefoglalva.

Optimalizálásként, ha String érték (például Unicode-karaktersztring) van rendezve, StringBuilder a rendező egy közvetlen mutatót ad át a hívónak a belső Unicode-puffer felügyelt sztringjeinek ahelyett, hogy egy új pufferbe másolta volna.

Figyelemfelhívás

Ha egy sztringet érték ad át, a hívónak soha nem szabad módosítania a rendező által átadott hivatkozást. Ezzel megsérülhet a felügyelt halom.

Ha a program hivatkozással ad át egy System.String karakterláncot, a hívás végrehajtása előtt a rendező átmásolja a sztring tartalmát egy másodlagos pufferbe. Ezután átmásolja a puffer tartalmát egy új sztringbe a hívásból való visszatéréshez. Ez a technika biztosítja, hogy a nem módosítható felügyelt sztring változatlan maradjon.

Ha egy System.Text.StringBuilder értéket ad át, a rendező átadja a StringBuilder belső pufferének ideiglenes másolatára mutató hivatkozást a hívónak. A hívónak és a hívónak meg kell egyeznie a puffer méretével. A hívó felelős egy megfelelő hosszúságú StringBuilder létrehozásáért. A hívónak meg kell tennie a szükséges óvintézkedéseket annak érdekében, hogy a puffer ne legyen túlfutva. A StringBuilder kivételt képez azon szabály alól, amely szerint az érték által átadott referenciatípusok alapértelmezés szerint paraméterekként In lesznek átadva. StringBuilder mindig a .-ként In/Outvan átadva.

Lásd még