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.
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:
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
/Out
van átadva.