optimalizálása alkalmazások

Component Object Model (Component Object Model, COM) úgy lett kialakítva, azzal a céllal, hogy lehetőséget teremt komponens bármilyen nyelv / platform, amely támogatást nyújt ehhez a modellhez, és használja őket, bármilyen nyelven / platform (egyéb), mivel támogatja a COM. A .NET-keretrendszer sem kivétel, és teszi könnyen kezelhető külső COM-objektumokat és az export a .NET típusok formájában COM-objektumokat.







A lényege a szervezet kölcsönhatások segítségével COM-objektumok ugyanaz, mint amikor a mechanizmus P / Invoke: Ön kijelenti, a COM-vezérelt az objektumot reprezentálja, és végezze el a CLR létrehoz egy objektum átalakító, amely végrehajtja a rendező. Kétféle csomagolóanyagok: csomagolóanyag, az úgynevezett futásidejű (futásidejű lehívható wrapper, RCW). amely lehetővé teszi a felügyelt kódot kell használni a COM-objektumok:

optimalizálása alkalmazások

valamint csomagolás, az úgynevezett COM-objektumok (COM lehívható wrapper, balra). amely lehetővé teszi a COM-objektum hívások menedzselt kód:

optimalizálása alkalmazások

Harmadik fél COM-objektumok gyakran ellátják főblokkról kölcsönhatások (elsődleges együttműködési Assembly, PIA). tartalmazza, hogy meghatározzuk, a gyártó által aláírt, és meghatározza a globális összeállítási gyorsítótárat (Global Assembly Cache, GAC). Ellenkező esetben lehet használni az eszközt tlbimp.exe. Ez is része a Windows SDK, amely automatikusan létrehoz egy-integrációs összeállítás alapján szereplő információk a típustárat.

Amikor kölcsönhatások segítségével COM-objektumok újra infrastruktúra elrendezésében paraméterek P / Invoke mechanizmussal, de egyéb beállításokat (például az alapértelmezett vonalat alakítjuk BSTR), így minden tanácsot, hogy kaptak egy korábbi cikkben a P / Indítsa mechanizmust is alkalmazni és itt.

COM modell saját teljesítmény problémák, mivel a jellegzetessége a COM, mint a többszálú modell egységek és között ellentmondás COM természet alapuló referencia számlálást, illetve a modell szemétgyűjtő .NET.

életciklus menedzsment

Kap egy hivatkozás a COM-objektumot NET, akkor tulajdonképpen kapok egy hivatkozás egy objektum átalakító RCW. Wrapper RCW mindig tárolja csak egy hivatkozás a COM-objektum, és minden, a COM objektum jön létre, csak az egyik esetben egy objektum átalakító RCW. Wrapper RCW megtartja saját referencia szám, mely nem jár a számláló-hivatkozás a COM objektumot. Ennek értéke hivatkozási száma általában 1, azonban lehet nagyobb is, amikor részt elrendezésében nagyobb felületek száma, vagy ha egy és ugyanazt a felületet hozzáfér több szálon a végrehajtás.

Mivel a .NET szemétgyűjtő futtatni kiszámíthatatlan időkben, és nem ismeri a menedzselt memória lefoglalt blokkok létrehozásához göngyölő RCW COM-objektumok, nem képes felgyorsítani a szemétgyűjtő, hogy a memória mennyisége nagyon nagy lehet.

Adott esetben okozhat Marshal.ReleaseComObject () módszer. hogy kifejezetten engedje az objektumot. Minden hívás csökkenti a számlálóját az RCW, és amikor eléri a nullát, a referencia száma automatikusan csökken a megfelelő COM-objektum (mint egy hívás fiializatora RCW). Miután felhívta Marshal.ReleaseComObject () metódus nem használható átalakító RCW.

Ha a hívás számláló RCW referencia lehet nullánál nagyobb, Marshal.ReleaseComObject () metódus lehet hivatkozni a hurok, amíg vissza nem tér a null értéket. A legjobb, ha hívja a Marshal.ReleaseComObject () a véglegesen blokkolni, hogy biztosítsa a kibocsátás a COM objektumot, akkor is, ha valahol a létrehozása egy példányát és a kibocsátás kivétel történik.

Elrendezésében a határ túloldalán egységek

Modell COM végrehajtja saját szál végrehajtását szinkronizációs mechanizmusokra támogató hívások különböző áramlások, hogy lehet használni akkor is, ha dolgozik tárgyak eredetileg nem szánt többszálú környezetben. Ezek a mechanizmusok csökkenthetik a teljesítményt helytelen alkalmazását. Bár ez a probléma nem kapcsolódik közvetlenül a kölcsönhatások segítségével COM-objektumokat .NET, azonban érdemes megvitatni, mert gyakran a gyakorlatban előforduló, valószínűleg azért, mert a fejlesztők, akik megszokták, hogy a tipikus módszereit szinkronizáció .NET nem tudom, mi történik pontosan a burkolat alatt a COM-objektumokat.

COM modell összekapcsolja a teljesítmény tárgyak, és patakok a egységek (lakások). alkalmazottak határokat, amelyeken keresztül a modell teljesít COM kéri. Összesen többféle egységek:

Single-egység (egyszálú apartman, STA)

Minden egységnek van egy végrehajtási szál, de lehetnek olyan objektumok száma. Bár lehet több osztály STA.

Többszálú egység (többszálú Apartment, MTA)

Minden egység lehet bármilyen számú szálak és tárgyak, de a folyamat lehet, hogy csak egy egység MTA. Ez a típus az alapértelmezett .NET.

Potokonezavisimye egységek (Neutral szálon Apartment, NTA)







Objektumokat tartalmaz, de nem folyik. A folyamat lehet csak egy egység NTA.

Kötődés a flow osztás történik, ha hívás CoInitialize vagy CoInitializeEx COM inicializálása-tárgy ebben az áramot. CoInitialize funkció társítja a patak egy új részleg a STA és az CoInitializeEx funkció lehetővé teszi, hogy meghatározza a berendezés típusától, STA vagy MTA.

A NET, akkor nem kell hívni ezeket a funkciókat közvetlenül, hanem ez elég hozzá egy attribútum vagy STAThread MTAThread a belépési pont az áramot (Main módszer). Azt is okozhat Thread.SetApartmentState () metódus vagy az ingatlan értékének meghatározott Thread.ApartmentState megkezdése előtt a végrehajtása egy szál, ha szükséges. Hacsak másként. NET inicializálja a szálak (beleértve a fő alkalmazási menet) tartozónak az AIT egységet.

Binding COM-objektumok végezzük egységtől kiindulva ThreadingModel paramétert az adatbázis, amely a következő értékeket:

Single - alapértelmezett elem bekerül az STA részlege.

Apartman - objektumot kell elhelyezni olyan egység STA, és csak akkor folyik ki a készüléket fogják engedni, hogy hivatkozhat közvetlenül az objektumot. Egyéb termékek hozhatók más STA egység.

Free - a tétel bekerül az MTA osztály. Ez az objektum közvetlenül felhasználható, és egyidejűleg a tetszőleges számú egységnyi folyamok AIT. A cél az, hogy támogatást nyújtson a használatra többszálú környezetben.

Mindkét - a tárgy kerül egy részlege, amely megteremtette annak programja (STA vagy MTA). Sőt, miután létrehozta azt válik sta- vagy AIT-szerű objektumot.

Semleges - egy objektum elhelyezett potokonezavisimoe egység és nem igényel elrendezésében. Ez - a leghatékonyabb módot.

Az alábbi ábra egy diagram közötti kapcsolat egységek, folyamok és tárgyak:

optimalizálása alkalmazások

Amikor megpróbál létrehozni egy objektumot modell támogatja patakok, összeegyeztethetetlen az áramlási modell ebben az egységben, akkor kap egy mutatót a felület, amely valójában arra utal, hogy a proxy. Ha meg kell, hogy adja át a COM-interfész objektumot egy másik szál tartozó másik egység, egy mutatót a felület kell továbbítani nem közvetlenül, hanem a elrendezésében mechanizmus. Infrastruktúra COM visszatér a megfelelő proxy objektumot.

A folyamat során a elrendezésében funkció hívás (ideértve a paraméterek) átalakul egy üzenetet, hogy meg kell küldeni az összes egység a fogadó STA. Mert STA mindenféle tárgy van megvalósítva, mint egy rejtett, az ablak eljárás, amely fogadja az üzeneteket és továbbítja a COM-objektumot az csonk (stub). Ezzel a megközelítéssel, COM-objektumokat az STA COM osztály mindig hivatkozni az azonos végrehajtási szál, amely biztosítja a biztonság, ha dolgozik egy többszálú környezetben.

Ha a hívó egység nem kompatibilis az egységgel COM-objektum, az áramlás van kapcsolva, és végrehajtjuk rendezését paraméter szálak között.

Annak elkerülése érdekében, a teljesítmény csökkenése miatt elrendezésében szálak között meg kell próbálnia összehangolni közötti COM-objektum osztó egység és generáljuk az áramlás. Létrehozása és a COM objektumok-STA STA a patakok az egységeket, és a COM objektumok a MTA osztály - a patakok az AIT. COM-objektumokat jelölt egyaránt támogató típusú egységek szabadon használható bármely a szálak nélkül extra fölött.

Hívjon STA tárgyak ASP.NET

Alapértelmezésben ASP.NET runtime végzi oldalon folyik az MTA. Ha ezek az oldalak nevezik tárgyakat az STA egységek, akkor jön a elrendezésében mechanizmus. Ha a nagy részét a használt objektumok STA tartozik megosztottság, ez azt eredményezi, teljesítmény csökkenés. Ez a probléma kiküszöbölhető ellenőrzésével oldal attribútum AspCompat. az alábbiak szerint:

Felhívjuk figyelmét, hogy a tervezők a lapok még mindig fut a MTA végrehajtási szál, így a tárgyak létrehozását STA kell végezni a Page_Load eseménykezelő és Page_Init.

Importálása Típuskönyvtárak és Code Access Security

A mechanizmus a Code Access Security végzi ugyanazt a biztonsági ellenőrzéseket, mint a P / Invoke. Akkor hozzá kulcs / biztonságos hívás esetén tlbimp.exe segédprogram, amely növeli SuppressUnmanagedCodeSecurityAttribute attribútumot az elkészített típusokat. Ezt a funkciót csak olyan rendszereken használja abszolút bizalmat, hiszen ez adhat okot biztonsági aggályok.

Mielőtt az első kiadása a .NET-keretrendszer 4.0 jön az alkalmazás vagy terjesztésére való együttműködés elsődleges együttműködési szerelvény szerelvények (elsődleges együttműködési szerelvények, PIA). Ezek a szerelvények általában mindig nagyon nagy (akár összehasonlítva a kód, amely őket), és általában nem tartalmazza a telepítőkészlet COM-összetevők; ehelyett külön kell telepíteni, mert ők maguk nem működtetéséhez szükséges COM-objektumok magukat. A másik ok, amiért PIA szerelvények nem tartoznak a beépítőkészletek, hogy fel vannak szerelve a globális szerelvény cache (GAC). Ez vezet a függőség .NET Framework egy egyébként teljesen független alkalmazásokat.

Verziótól kezdődően a .NET Framework 4.0, fordítókat a C # és VB.NET ellenőrizheti, hogy melyik COM-interfészek és módszerek a kódot, és másolja ki és illesszük be a hívó szerelvény csak a valóban szükséges definíciókat, csökkentve kód mérete és így nincs szükség terjeszteni a könyvtár PIA. A Microsoftnál, ez a funkció nevezték NoPIA. Úgy működik, mind a PIAS, mind pedig Interoperációs szerelvények általában.

PIA összeállítások van egy fontos jellemzője, amely az úgynevezett ekvivalencia típusok. Mivel van egy szigorú elnevezési és elhelyezni a globális cache szerelvények, különböző komponenseket lehet szabályozni részesedés és pakolások RCW szempontjából .NET akkor van azzal egyenértékű. Ezzel szemben a való együttműködés szerelvény generált tlbimp.exe, nem kell ezt a funkciót, mert minden egyes komponenst ebben az esetben kap saját, külön a többiektől, egy-integrációs egységet. Az Advent a támogató funkciók NoPIA feleslegessé szigorú elnevezési részegységek és a Microsoft olyan megoldást javasolt, amely lehetővé teszi, hogy értelmezze a wrapper RCW más összeállítások tartozó azonos típusú, ha a felületek azonos GUID.

Annak érdekében, hogy NOPIA, válasszuk a Tulajdonságok Visual Studio helyi menü, ha a jobb gombbal a interoperabilitási szerelvényt a referenciák rész, és állítsa be a beágyazása együttműködéshez típus (Bemutatni típusú interakciók) a True érték:

optimalizálása alkalmazások

kivételek

A legtöbb módszerek COM interfészek jelentést a siker vagy kudarc visszaküldésével értéke típusú HRESULT. A negatív értékek HRESULT (a magas bit készlet) Hibabejelentéshez és nulla (S_OK), illetve pozitív értékek - a sikerről. Ezen túlmenően, a COM-objektum visszatérhet további hibainformációkat a hívás SetErrorInfo funkció átadva IErrorInfo által létrehozott objektum hívja CreateErrorInfo.

Amikor az úgynevezett COM-módszerrel mechanizmusán keresztül kölcsönhatások COM, előtérügyeletes stub átalakítja HRESULT értéket mutatott kizárási szerint a legtöbb HRESULT érték és adatokat tartalmaz az objektum IErrorInfo. Mivel a gerjesztés egy kivétel meglehetősen drága művelet, a funkció COM-objektum, amelyek gyakran nem, hogy hátrányosan befolyásolja a teljesítményt. Akkor elnyomni az automatikus konvertálás kivételek, jelölési módszerek attribútum PreserveSigAttribute. Ebben az esetben meg kell változtatni a kezelt aláírás, mint egy visszatérési értéke int típusú, a melynek eredménye lesz meghatározó retval paramétert.




Kapcsolódó cikkek