2009-11-20 12 views
9

हम पंजीकरण-मुक्त COM करने के लिए मैनिफेस्ट फ़ाइलों का उपयोग करते हैं, क्योंकि मैंने this other question में भी विस्तार किया है।प्लग-इन आर्किटेक्चर में पंजीकरण-मुक्त COM कैसे करें

अब हम प्लग-इन का समर्थन करने वाले एप्लिकेशन के साथ पंजीकरण-मुक्त COM का उपयोग करने का प्रयास कर रहे हैं। प्लग-इन ओसीएक्स फाइलें हैं जिन्हें मुख्य एप्लिकेशन के पहले से इंस्टॉल होने के बाद मुख्य एप्लिकेशन के फ़ोल्डर में जोड़ा जा सकता है।

हालांकि, इसका मतलब है कि मुख्य एप्लिकेशन की मेनिफेस्ट फ़ाइल को प्लग-इन इंस्टॉलर द्वारा पैच करने की आवश्यकता होगी। ऐसा लगता है कि ऐसा करने के लिए एक खतरनाक और त्रुटि-प्रवण चीज है, खासकर यदि एकाधिक प्लग-इन इंस्टॉल किए जा सकते हैं।

क्या किसी भी तरह से मुख्य एप्लिकेशन की मेनिफेस्ट फ़ाइल को विभाजित करने का कोई तरीका है, ताकि प्रत्येक प्लग-इन सुरक्षित रूप से एक अलग फ़ाइल के रूप में अपना स्वयं का हिस्सा जोड़ सके? या मैनिफेस्ट फ़ाइल पैच करने के लिए एक और सुरक्षित तरीका?

यदि यह प्रासंगिक है: हम wix के साथ हमारे इंस्टॉलर बनाते हैं।

उत्तर

6

मैं आवेदन की मैनिफेस्ट फ़ाइल को संशोधित करने की अनुशंसा नहीं करता; जो काफी नाजुक लगता है और केवल तभी काम करेगा जब वह लिखने योग्य स्थान पर रहता है।

प्रक्रिया स्टार्टअप पर, एक अनुप्रयोग का मैनिफेस्ट "सक्रियण-संदर्भ" उत्पन्न करने के लिए उपयोग किया जाता है जिसे प्रक्रिया-व्यापी सक्रियण संदर्भ के रूप में धक्का दिया जाता है। लेकिन प्रत्येक धागे में एक सक्रियण-संदर्भ स्टैक भी होता है, जिसे सीधे तौर पर छेड़छाड़ की जा सकती है। किसी दिए गए थ्रेड पर संचालन स्टैक पर शीर्ष संदर्भ और COM पंजीकरण डेटा की तलाश करते समय प्रक्रिया-व्यापी सक्रियण संदर्भ दोनों पर दिखता है।

सिफारिश यह है कि किसी भी समय प्लगइन कोड को COM में कॉल करने की आवश्यकता होती है, प्लगइन-विशिष्ट मैनिफेस्ट को थ्रेड पर सक्रिय किया जाना चाहिए। यह सबसे आसानी से दो तरह से किया जा सकता है:

  1. एम्बेड प्लगइन में मालसूची और मैक्रो ISOLATION_AWARE_ENABLED परिभाषित के साथ संकलन एक आईडी 2 के रूप में प्लगइन विशेष प्रकट। यह मूल रूप से सामान्य विंडोज एपीआई को लपेटता है जिसे कॉल के आस-पास उचित सक्रियण संदर्भ को स्वचालित रूप से सक्रिय और निष्क्रिय करने के लिए एक मैनिफेस्ट से संदर्भ की आवश्यकता होती है।

  2. प्लगइन में सभी प्रविष्टि बिंदुओं के आस-पास धागे पर उचित सक्रियण संदर्भ सक्रिय/निष्क्रिय करें। यह activation context APIs के माध्यम से किया जाता है। यह context management object सक्रियण के साथ सबसे आसानी से किया जाता है।

+0

+1 दिलचस्प! ऐसा लगता है कि मेरे पास कुछ पढ़ने के लिए है। –

+0

धन्यवाद, यूजीन। क्या आप किसी भी नमूना कोड के बारे में जानते हैं जो कम से कम इनमें से एक समाधान का उपयोग करता है? धन्यवाद। –

+1

मुझे वास्तव में गाइड का पालन करके यह काम करने के लिए मिला: http://www.mazecomputer.com/sxs/help/sxsapi3.htm और यहां vvvsample से उदाहरण कोड भी: http://msf.codeplex.com/लेकिन मुझे COM dll को उसी निर्देशिका में कॉपी करना होगा जैसा कि मैं बचाना चाहता हूं। मैं वर्तमान में बाह्य अभिव्यक्ति का पूरा पथ और परीक्षण निर्देशिका का पूरा पथ CACTCtxHandle.Create() (उदा। "सी: \ Rel \ MyCppTests.dll.manifest" और "C: \ Rel" क्रमशः)। COM dll भी "सी: \ रिले" में रहता है लेकिन exe एक अलग निर्देशिका में रहता है (उदा। "सी: \ TestRunner")। कोई विचार? –

4

आप नेट का उपयोग कर रहे हैं, तो आप the code इस जवाब में दिखाया गया है का उपयोग सक्रियण संदर्भों की देखभाल करने के लिए कर सकते हैं।

+0

यह बहुत अच्छा काम किया! धन्यवाद, सैमुअल! :) –

संबंधित मुद्दे