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


Útmutató In-Process bővítmények implementálására

A folyamaton belüli bővítmények minden olyan folyamatba betölthetők, amelyek aktiválják őket. Egy Shell-névtérbővítmény például betölthető bármely olyan folyamatba, amely közvetlenül vagy közvetve hozzáfér a Shell-névtérhez. A Shell-névteret számos Shell-művelet használja, például egy közös fájl párbeszédpanelének megjelenítése, egy dokumentum elindítása a társított alkalmazáson keresztül, vagy a fájl megjelenítéséhez használt ikon beszerzése. Mivel a folyamaton belüli bővítmények tetszőleges folyamatokba tölthetők be, ügyelni kell arra, hogy ne legyenek negatív hatással a gazdaalkalmazásra vagy más folyamatban lévő bővítményekre.

Különösen figyelemre méltó a közös nyelvi futtatókörnyezet (CLR), amely más néven felügyelt kód vagy a .NET Frameworknéven is ismert. Microsoft javasolja, hogy ne írjon felügyelt folyamaton belüli bővítményeket a Windows Intézőbe vagy a Windows Internet Explorerbe, és nem tartja őket támogatott forgatókönyvnek.

Ez a témakör azokat a tényezőket ismerteti, amelyeket figyelembe kell vennie, amikor megállapítja, hogy a CLR-en kívüli futtatókörnyezet alkalmas-e a folyamatban lévő bővítmények általi használatra. További futtatókörnyezetek például a Java, a Visual Basic, a JavaScript/ECMAScript, a Delphi és a C/C++ futtatókörnyezeti kódtár. Ez a témakör azt is ismerteti, hogy a felügyelt kód nem támogatott a folyamatban lévő bővítményekben.

Verzióütközések

A verzióütközés olyan futtatókörnyezeten keresztül fordulhat elő, amely nem támogatja több futtatókörnyezeti verzió betöltését egyetlen folyamaton belül. A CLR 4.0-s verzió előtti verziói ebbe a kategóriába tartoznak. Ha egy futtatókörnyezet egyik verziójának betöltése nem zárja ki ugyanannak a futtatókörnyezetnek más verzióinak betöltését, ütközést okozhat, ha a gazdaalkalmazás vagy egy másik folyamatban lévő bővítmény ütköző verziót használ. Ha egy verzió ütközik egy másik folyamatban lévő kiterjesztéssel, az ütközés nehezen reprodukálható, mert a hiba a megfelelő ütköző bővítményeket igényli, és a hibamód az ütköző bővítmények betöltésének sorrendjétől függ.

Gondoljon egy olyan folyamatban lévő bővítményre, amelyet a 4.0-s verzió előtti CLR verzióval írtak. Minden olyan számítógépes alkalmazás, amely egy fájl Open párbeszédpanelt használ, potenciálisan betöltheti a párbeszédpanel felügyelt kódját és annak kapcsolódó CLR-függőségét az alkalmazás folyamatába. Az alkalmazás vagy bővítmény, amely először tölti be a CLR 4.0 előtti verzióját az alkalmazás folyamatába, korlátozza, hogy a CLR mely verziói használhatók később az adott folyamat során. Ha egy Open párbeszédpanelt tartalmazó felügyelt alkalmazás a CLR ütköző verziójára épül, akkor a bővítmény nem fog megfelelően futni, és hibákat okozhat az alkalmazásban. Ezzel szemben, ha a bővítmény az első, amely betöltődik egy folyamatban, és a felügyelt kód ütköző verziója ezt követően megpróbál elindulni (esetleg egy felügyelt alkalmazás vagy egy futó alkalmazás igény szerint betölti a CLR-t), a művelet meghiúsul. A felhasználó számára úgy tűnik, hogy az alkalmazás egyes funkciói véletlenszerűen leállnak, vagy az alkalmazás rejtélyes módon összeomlik.

Vegye figyelembe, hogy a CLR 4.0-s vagy újabb verziói általában nem érzékenyek a verziószámozási problémára, mivel úgy vannak kialakítva, hogy egymással és a CLR 4.0 előtti verzióival együtt létezhessenek (kivéve az 1.0-s verziót, amely nem lehet együtt létezni más verziókkal). A verzióütközéseken kívül más problémák is felmerülhetnek, ahogy a jelen témakör többi részében is tárgyaltuk.

Teljesítménnyel kapcsolatos problémák

Teljesítményproblémák merülhetnek fel olyan futtatóidők esetén, amelyek jelentős teljesítménycsökkenést okoznak egy folyamatba való betöltéskor. A teljesítménybírság lehet például memóriahasználat, processzorhasználat, eltelt idő, vagy akár a helyhasználat kezelése is. A CLR, a JavaScript/ECMAScript és a Java ismerten nagy hatású futtatókörnyezetek. Mivel a folyamaton belüli bővítmények számos folyamatba betölthetők, és gyakran teljesítményérzékeny pillanatokban (például a felhasználó által megjelenítendő menü előkészítésekor) történik, a nagy hatású futtatókörnyezetek negatívan befolyásolhatják a teljes válaszkészséget.

Az erőforrásigényes és nagy hatású végrehajtás hibát okozhat a gazda folyamatban vagy egy folyamat-bővítményben. Például egy nagy hatású futtatókörnyezet, amely több száz megabájt címteret használ fel a halom számára, azt eredményezheti, hogy a gazdaalkalmazás nem tud betölteni egy nagy adathalmazt. Emellett mivel a folyamaton belüli bővítmények több folyamatba is betölthetők, az egyetlen bővítményben lévő magas erőforrás-felhasználás gyorsan megsokszorozható a teljes rendszer magas erőforrás-felhasználásával.

Ha egy futtatókörnyezet betöltve marad, vagy más módon továbbra is erőforrásokat használ, még akkor is, ha az adott futtatókörnyezetet használó bővítmény ki van ürítve, akkor ez a futtatókörnyezet nem alkalmas bővítményekben való használatra.

A .NET-keretrendszerre vonatkozó problémák

A következő szakaszok példákat mutatnak be a felügyelt kód bővítményekhez való használatával kapcsolatos problémákra. Ezek nem a lehetséges problémák teljes listája. Az itt tárgyalt problémák mindkét oka annak, hogy a felügyelt kód nem támogatott a bővítményekben, és figyelembe kell venni a többi futtatókörnyezet használatának értékelésekor figyelembe veendő pontokat.

Újrabeléphetőség

Ha a CLR blokkolja az egyszálas lakás (STA) szálát, például egy Monitor.Enter, WaitHandle.WaitOne vagy zárolási utasítás miatt, a CLR a szokásos konfigurációjában beágyazott üzenethurkot ad meg várakozás közben. Számos kiterjesztési módszer nem használható az üzenetek feldolgozására, és ez a kiszámíthatatlan és váratlan újrareagálás rendellenes viselkedést eredményezhet, amelyet nehéz reprodukálni és diagnosztizálni.

A többszálú apartman

A CLR futtatókörnyezeti hívható burkolókat hoz létre komponensobjektum-modell (COM) objektumokhoz. Ugyanezeket a futtatókörnyezeti hívható csomagolókat a CLR lezáró később megsemmisíti, amely a többszálú apartmanmodell (MTA) része. A proxy áthelyezése az STA-ról az MTA-ra adattovábbítást igényel, de a bővítmények által használt interfészek nem mind átalakíthatók.

Nem determinisztikus objektumélettartamok

A CLR-nek gyengébb az objektum élettartama, mint a natív kód. Számos bővítmény rendelkezik hivatkozásszám-követelményekkel az objektumokra és felületekre vonatkozóan, és a CLR által alkalmazott szemétgyűjtési modell nem tudja teljesíteni ezeket a követelményeket.

  • Ha egy CLR-objektum egy COM-objektumra mutató hivatkozást szerez be, a futtatókörnyezeti hívható burkoló által tárolt COM-objektumhivatkozás nem lesz felszabadítva, amíg a futtatókörnyezeti hívható burkoló szemétgyűjtésre nem kerül. A nemdeterminista kiadási viselkedés ütközhet néhány felületi szerződéssel. Az IPersistPropertyBag::Load metódus például megköveteli, hogy az objektum ne hivatkozzon a tulajdonságcsomagra, amikor a Load metódus visszatér.
  • Ha egy CLR-objektum hivatkozást visszaadnak a natív kódnak, a futtatókörnyezeti hívható burkoló megszünteti a CLR-objektummal való hivatkozását, amikor az utolsó hívást hajtja végre a Release, de a mögöttes CLR-objektumot csak akkor véglegesítik, amikor azt a szemétgyűjtő összegyűjti. A nemdeterminista véglegesítés ütközhet néhány interfészszerződéssel. A miniatűrkezelőknek például azonnal fel kell szabadítaniuk az összes erőforrást, amikor a hivatkozásszám nullára csökken.

A felügyelt kód és egyéb futtatókörnyezetek elfogadható használata

A folyamaton kívüli bővítmények implementálásához elfogadható felügyelt kód és egyéb futtatókörnyezetek használata. A folyamaton kívüli Shell-bővítmények például a következők:

  • Előnézeti kezelők
  • Parancssori műveletek, például azok, amelyek a shell alatt vannak regisztrálva, mint\ige és\parancs alkulcsok.
  • A helyi kiszolgálón implementált COM-objektumok olyan Shell-bővítménypontokhoz, amelyek lehetővé teszik a folyamaton kívüli aktiválást.

Egyes bővítmények folyamatban lévő vagy folyamaton kívüli bővítményekként is implementálhatók. Ezeket a bővítményeket folyamaton kívüli bővítményként is implementálhatja, ha nem felelnek meg a folyamaton belüli bővítményekre vonatkozó követelményeknek. Az alábbi lista példákat mutat be a folyamatban lévő vagy folyamaton kívüli bővítményként implementálható bővítményekre:

  • IExecuteCommand a DelegateExecute bejegyzéshez társítva, amely egy shell\ige\parancs alkulcs alatt van regisztrálva.
  • IDropTargetshell\verb\DropTarget alkulcs alatt regisztrált CLSID-hez társítva.
  • IExplorerCommandState egy CommandStateHandler bejegyzéshez van társítva, amely egy rendszerhéj\ige alkulcsában van regisztrálva.