Munka com objektum kölcsönhatás segítségével összeállítások, vagy „miért irodai csomag
Ez a dokumentáció átkerül az archívumot, és nem támogatja.
Ezen az oldalon ...
A .NET-keretrendszer számos mechanizmusok közötti adatcserére alkalmazások és .NET Framework COM-objektumokat. Ahhoz azonban, hogy a szivárgás megakadályozása érdekében a memória használata esetén a COM-objektumok, vagy ha váratlanul leállna a COM-objektum, ezeket a funkciókat kell használni elég ügyesen.
A legkényelmesebb módja a munka segítségével COM-objektumok - való együttműködés szerelvények (-integrációs egységek). Ebben az esetben a .NET alapú alkalmazás együttműködik a modul RCW (Runtime lehívható wrapper - wrapper .NET-hívások), amely szabályozza a csere egy COM-objektumot. RCW modulok számos hasznos funkciót használatakor COM-objektumok, többek aktiválás marsall komponensek és paraméterek (például a konverziós adatok karakterláncot BSTR COM-vonal). A Microsoft a különleges való együttműködés összeállítás használható a Microsoft Office rendszer, az úgynevezett elsődleges együttműködési szerelvény (elsődleges együttműködési szerelvények, PIA). Ezen eszközök azonban nem teszik lehetővé, hogy megoldja a problémákat, amelyek a feldolgozás életciklusának COM-objektumok, ezért meg kell találni a módját, hogy felismerjék és kezelni ezeket a problémákat más eszközökkel.
I leállt gomb
Hirtelen minden látható ok nélkül, ha megnyomja a gombot, a feldolgozási eljárás a Click esemény már nem váltott ki. Kattintson esemény a gombot leáll.
A legtöbb fejlesztő volna hamar felfedezték a problémát, ha a program leállt, a Click esemény után azonnal az eljárást, és kilép a változó nem megy ki a hatálya alól. Ez az az idő, amikor a COM-alkalmazás, amely kezeli a Word, a probléma. Azonban a .NET Framework tárgyat nem kell semmisíteni után azonnal megszűnik, hogy látható legyen. Ehelyett létezni fog, amíg a .NET Framework Nem vesztem el minden pillanatban. Mindez idő, a program Click esemény, amikor a felhasználó megnyomja a menü gombot sikeresen elvégzett, majd hirtelen leáll helyesen, ha a .NET-keretrendszer végül elpusztítja az objektumot. Ez az alapvető különbség a feldolgozás módja objektumok életciklusa, és így a memória közepes COM és .NET Framework.
Memória kezelése .NET és COM modellek
A .NET-keretrendszer használjuk. ha szabad így mondanom, „ellenkező” laza megközelítés szabad memória. A tárgyak eltávolítása a memóriából szemétgyűjtő, az ellenőrzést készül, hogy az objektumok már nem használják. Az összeszerelési folyamat passzív elég szemetet. Ez fut csak szükség esetén; általában akkor, ha nincs elég memória. A .NET-keretrendszer esetén megsemmisítése a változó objektumot, amelyre vonatkozik, egyszerűen válik a jelölt eltávolítása valamikor a jövőben. További információ a koncepció és szemétgyűjtés a .NET Framework, lásd. Cikk „szemétgyűjtő programozás” a .NET-keretrendszer fejlesztői útmutató.
Ilyen módon a memória felszabadítása problémát okoz az esemény Click. A .NET-alkalmazás változót, amely utal a RCW modul, amely ellenőrzi a Word alkalmazás végén az eljárás megy ki a körét, hanem csak azt jelenti, hogy az RCW szabályozó egység a COM-objektum van jelölve szemétgyűjtő. Végül, RCW le lehet szerelni a memóriából, amikor eltávolítja a szemetet, és ebben az időben COM-objektum, amely kezeli a modul RCW, meg kell semmisíteni. Csak ezt követően .NET-alkalmazás elveszíti a kapcsolatot a Click eseményt egy gombot, és leáll.
COM-Memory Management
Azonban, ha kell felszabadítani COM-objektum kérelem kitöltéséhez, egy másik probléma merül fel: a memória nem lehet visszaállítani megfelelően. A .NET alkalmazás, akkor tönkre minden utalást RCW modul a megfelelő COM-objektum, de a COM-objektum nem feltétlenül eltávolítani. Például egy olyan alkalmazást, folytonosan szívja és lereszti Szó feldolgozására egy sor dokumentumot nem lehet elég memória, mint a korábban használt példányait Ige még mindig benne marad. A programozó kezelni a saját COM-objektumokat, hogy csökkentsék a terhelést a memóriában.
Ezért COM-objektumokat az Office szemléltetik a lehetséges problémákat. Mint sok nagy COM-szerverek, különböző Office alkalmazások tartalmaz több száz tárgyat, és a közös feladatok létrehozásához szükséges esetben több objektumot. Például, az alábbi program elindítja a Word alkalmazást, felhasználva annak elsődleges együttműködési szerelvény (PIA), majd azt használja RCW modul, ami egy dokumentumot:
Ez a program tölti be a memóriába három tárgyat: RCW modul, amely kezeli az objektum alkalmazás Word alkalmazás és dokumentumok gyűjteménye tárgy dokumentum. Ha a következő lépés egy nagy dokumentum betöltött kép, a memória mennyiségét által elfoglalt COM-objektum igen nagy lehet.
Használat után, törölheti tárgyak, ez feleslegessé változók hivatkozó Szó tárgyak:
Sajnos, a szemétgyűjtés memória által elfoglalt COM-objektumokat nem lehet visszaállítani, ha a szemétgyűjtő folyamat fut hiánya miatt a memória. Amikor szemétgyűjtő kísérelték szelektíven távolítják el az objektumokat a memóriából: tárgyak, amelyeket nem használnak hosszú ideig, akkor kap egy magasabb prioritású szemétgyűjtő, mint a tárgyakat, amelyeket használni hosszú ideig. Ez azt jelenti, hogy a kibocsátás a COM-objektumot közvetlenül a befejezése után a munka növeli annak valószínűségét, hogy el fogjuk távolítani gyorsan szemétgyűjtés.
Megjegyzés. További információ a szemétdíj és annak hatása a teljesítményre, lásd. Cikk szemétgyűjtő alapjai és teljesítmény Tippek a .NET-keretrendszer fejlesztői útmutató (angol nyelven).
Amikor dolgozik egy tárgyat a COM-.NET használt alkalmazásokkal két tárgy wrapper RCW és COM-objektum (vagy tárgyak). A szemétgyűjtő ismert csak a méret a modul RCW (amely lehet kicsi), és a COM-objektum méretét (ami nagy is lehet) ismeretlen. Ezért annak ellenére, hogy a .NET alkalmazás engedje RCW modul a folyamat szemétgyűjtő RCW modul nem lehet eltávolítani a memóriából még abban az esetben hiány. Míg RCW modul a memóriában marad, sikerült COM-objektumot is a memóriában marad.
Úgy tűnhet, hogy a problémát meg lehet oldani, ha az kötelező futtatni szemétgyűjtő RCW. Azonban, arra kényszerítve kiváltó szemétgyűjtő szinte mindig rossz döntés a .NET-keretrendszer. Továbbá, lehet, hogy használhatatlan, mert nem garantálja eltávolítása COM-objektumot. Még ha kifejezetten meghívja szemétgyűjtő mindig marad önkényes a .NET-keretrendszer.
Két biztosító mechanizmusokat eltávolítását COM-objektumok memória: AppDomain tárgy és ReleaseComObject módszer. A AppDomain tárgy a legegyszerűbb megoldást biztosít COM-objektumokat, de van egy komoly veszélye a teljesítmény rovására menne. Az eljárást alkalmazva ReleaseComObject nem jelent problémát, de többre van szükség, gondos tervezés és kódolás.
COM-objektum kezelése útján AppDomain osztály
Között .NET Framework AppDomain objektum különálló környezetben futó alkalmazások. A pont a COM-objektum kezelése nézetobjektumok AppDomain jó annak a ténynek köszönhető, hogy amikor rakodni és kirakott az összes erőforrás általuk használt. A stratégia egyszerű: minden egyes létrehozott objektum létrehozása COM-objektum AppDomain és töltse be a COM-objektumot. Ezen túlmenően, ez a módszer egyszerűsíti a munkát a COM-objektumokat, mivel lehet letölteni több COM-objektumok egy domain, és törölje mindet egyszerre.
Ugyanakkor, ami a AppDomain objektum jelentős erőforrásokat, így nem lehet használni, ha fontos, hogy fenntartsák a magas teljesítményt. Ezen felül, ha lehetőség van a külső hozzáférést a AppDomain tárgy, biztonsági hozzáférési kód van törve (ha nincs külső hozzáférést, AppDomain tárgy biztonságos).
A következő példa azt feltételezi, hogy van egy COM-objektum MyDLL.MyObject típus egy fájlnevet MyDLL.DLL. Egy alkalmazás hozzáadása a linket a COM-könyvtár, szükség van a Project menüben, majd a Hozzáadás Reference, majd kattintson a Tallózás gombra, és válassza ki a fájlt MyDLL.DLL.
Hozzáadása után egy referencia a COM-objektum, ez tölthető be a AppDomain, alkalmazásával CreateInstanceFromAndUnWrap módszerrel. A módszer két paramétert: a teljes elérési utat a való együttműködés összeszerelés és a belépési pont egy osztály modult. -integrációs szerelvény helymeghatározás segítségével Type objektumot. Csatlakoznak hozzá Assembly Location objektumnak van egy tulajdonsága, amely jelzi, hogy hol található a interoperabilitási szerelvény. Kezdetben RCW modul van csomagolva megakadályozza a szükségtelen adatok betöltése típusfüggvénytár, de CreateInstanceFromAndUnWrap módszer is eltávolítja a bőrt.
A következő példa definiálja AppDomain objektum típusát elemzi mydomain, majd betölti a COM-objektumot. Munka után, a COM-objektumok AppDomain ürítik, felszabadító és COM-objektum:
COM-objektum kezelése módszerrel ReleaseComObject
Mint alternatív lehetőség a AppDomain objektum lehet kénytelen eltávolítani a COM-objektumot a memóriából, csökkentve a hivatkozási száma a COM-objektumot nullára. Eltávolítása után a COM-objektumot a memória modul ezután felszabadíthatja RCW (további szemétgyűjtő). Ez a módszer sokkal nehezebb, mint az előző, de elkerüli a teljesítmény kapcsolatos degradáció létrehozása AppDomain objektumot.
Amikor létrehoz egy modult RCW COM-objektum referencia száma beállítás egységet. Nem számít, mennyi .NET kliensek utalnak RCW modul egyetlen folyamat, a számláló-hivatkozás a COM objektum még mindig egyenlő eggyel. Azonban, ha az átviteli egység RCW túl eljárás korlátozza a számláló COM-objektum referenciák növelhető úgy, hogy a referencia szám nem feltétlenül egyenlő eggyel.
A .NET-keretrendszer lehetőséget nyújt, hogy csökkentse a számláló értéke linkek COM-objektumot közvetlenül elhaladó RCW modul ReleaseComObject System.Marshall osztály módszer. Ez a módszer értékét adja vissza a pult referencia COM-objektum után csökkentésére. Ebben a példában, az Ige alkalmazás betöltése, a referencia száma csökken, majd megszabadítjuk modul RCW:
Kezelni az esetekben, amikor a visszaadott érték ReleaseComObject, nullánál nagyobb, akkor lehet hívni egy eljárás egy ciklusban, ami miatt ReleaseComObject objektumot, amíg a visszatérési érték nem egyenlő nullával:
Használata ReleaseComObject eljárás felszabadítja a COM-objektum, míg más tárgyak is függ rajta. Ezután kísérletet dolgozni RCW modul .NET alkalmazások vezet a kirekesztés System.Runtime.InteropServices.InvalidComObjectException további információkat «COM objektum lett elválasztva a mögöttes RCW nem lehet használni» ( «COM-objektum, amely le van választva az RCW nem lehet használni „). Ezért szükséges, hogy pontosan tudja, ha az alkalmazás kilép egy tárgyat, hogy képes csökkenteni a számláló értékét. Az egyik módja annak, hogy a következetesség és egyértelműség, hogy a hívásokat ReleaseComObject módszer egy általános módszer véglegesítő / dobja a tárgyat. Ez alkalmat ad egyértelmű összefüggés a találmány szerinti eljárás végrehajtását véglegesítése .NET objektumot, és engedje el a megfelelő COM-objektumot.
következtetés
Ez a cikk ismerteti a közös problémák merülnek fel, amikor a fejlődő .NET Framework futó programok segítségével COM-objektumokat, és javaslatot ad, hogyan lehet megváltoztatni a szoftver megoldás, hogy megszüntesse ezeket a problémákat. Különösen kívánatos, hogy elkerüljék a megjelenése kapcsolatok egy tárgyat a COM-scope előtt COM-objektum megszűnik. Vagyis, ha az alkalmazás készen áll, hogy kiadja a COM-objektumot, meg kell győződnie arról, hogy a COM-objektum törlődik a memóriából. A két leírt mechanizmus AppDomain osztály csak egy ellenőrző mechanizmus életciklusok COM-objektum, és használja ReleaseComObject módszer jobb teljesítményt nyújt.
Peter Vogel (MBA, Microsoft Certified Developer) - a fej a PHV információs szolgáltatásokat. PHV fejlesztésére specializálódott a .NET és XML. Peter tervezett, készített és telepített intranet és többkomponensű rendszerek Bayer AG, az Exxon, a Christie Digital és a kanadai bank kanadai Imperial Bank of Commerce.