2009-07-29 15 views
7

का उपयोग करने के लिए .NET इंटरऑप फोर्स करें क्या इसके संबंधित COM DLL की स्थानीय प्रति को संदर्भित करने के लिए एक इंटरऑप असेंबली को मजबूर करना संभव है?स्थानीय COM DLL

मैं एक इंटरॉप विधानसभा (Interop.OTAClient.dll), जो एक COM DLL (OTAClient.dll, जिसके लिए स्वचालन एपीआई है के लिए इंटरॉप है का संदर्भ देता है एक .NET अनुप्रयोग है:

यहाँ परिदृश्य है एचपी गुणवत्ता केंद्र)। मैं COM पर बहुत जानकार नहीं हूं, लेकिन जैसा कि मैं समझता हूं कि इंटरऑप असेंबली एक विशिष्ट फ़ाइल को इंगित करने के बजाय रजिस्ट्री में GUID संदर्भों के माध्यम से COM कक्षाओं को देखती है।

मेरे पास यह मुद्दा है कि OTAClient.dll की प्रतिलिपि है कि रजिस्ट्री कुंजियों को विभिन्न संस्करणों द्वारा अधिलेखित किया जाता है, इस पर निर्भर करता है कि क्यूसी के किस संस्करण में मैंने अभी ब्राउज़र में लॉग इन किया है, और इन डीएलएल के विभिन्न संस्करण एक दूसरे के साथ संगत नहीं हैं। .NET ऐप केवल क्यूसी के विशिष्ट संस्करण से कनेक्ट होगा, इसलिए मेरे पास COM DLL इस तरह से भिन्न नहीं हो सकता है।

किसी भी सुझाव की बहुत सराहना की जाएगी, क्योंकि यह व्यवहार वास्तव में परेशान है। मैंने COM इंटरॉप मुद्दों पर अन्य प्रश्नों को देखा है, लेकिन वे सभी वास्तविक COM DLL से जुड़े इस विशेष परिदृश्य के बजाय, जीएसी में एक के बजाय इंटरऑप डीएलएल के स्थानीय संस्करण को मजबूर करने के बारे में प्रतीत होते हैं।

उत्तर

5

आप Registration-free COM चाहते हैं।

+0

हाय पावेल। लिंक के लिए धन्यवाद - मैंने उदाहरण का पालन किया, और वीएस ने उम्मीद के अनुसार ओटीएक्लिएंट के लिए मैनिफेस्ट एंट्री उत्पन्न की।हालांकि, मैं अभी भी वही लक्षण देखता हूं यदि डीएलएल का नया संस्करण ब्राउज़र ऐप द्वारा आखिरी बार उपयोग किया गया है जो कि डीएलएल का भी उपयोग करता है। क्या आपको लगता है कि यह संभव है कि ओटीएक्लिएंट की अपनी निर्भरताएं हैं जो नए संस्करणों के साथ ओवरराइट हो रही हैं? यदि हां, तो इस पर कोई सुझाव है कि मैं इससे कैसे निपट सकता हूं? – Xiaofu

+0

यह संभव हो सकता है यदि वे निर्भरता स्वयं COM घटक हैं। यदि ऐसा है, तो आपको उन्हें उसी तरह से संभालना चाहिए (ताकि आप पुस्तकालयों के एक आत्मनिर्भर सेट के साथ समाप्त हो जाएं)। –

10

पावेल ने मुझे सही दिशा में इंगित किया, इसलिए मैं उसे जवाब के रूप में चिह्नित कर रहा हूं। हर किसी के लाभ के लिए, मैंने यह किया है:

  1. मूल OTAClient.dll का संदर्भ जोड़ा गया और विजुअल स्टूडियो इंटरऑप लाइब्रेरी उत्पन्न करने दें।
  2. समाधान एक्सप्लोरर में संदर्भित लाइब्रेरी पर राइट-क्लिक करें और गुण क्लिक करें। फिर सही से अलग सेट करें। यह वीएस को एक प्रकट फ़ाइल उत्पन्न करने का कारण बनता है जो आपके प्रोग्राम को रजिस्ट्री में सूचीबद्ध किसी के बजाय स्थानीय रूप से आपकी COM लाइब्रेरी के लिए देखने के लिए कहता है।
  3. मेरे परिदृश्य के लिए विशिष्ट - मुझे गुणवत्ता केंद्र से WebClient.dll का संदर्भ देना पड़ा और इसके लिए अलग से सेट को भी सेट करना पड़ा। इसका उपयोग ओटीए एपीआई का उपयोग कर सीधे ऐप्स द्वारा नहीं किया जाता है, लेकिन ऐसा लगता है कि OTAClient.dll द्वारा संदर्भित किया गया है।

इस तरह, आप क्यूसी उदाहरणों में लॉग इन कर सकते हैं और जिनके संस्करण आपके ऐप द्वारा इसे तोड़ने के बिना इस्तेमाल किए गए हैं। मेरे मामले में, मेरे पास एक स्थानीय क्यूसी उदाहरण है जो v9 है और प्रोजेक्ट-विशिष्ट स्वचालन के लिए उपयोग किया जाता है (विभिन्न कारणों से, इसे हमारी आवश्यकताओं को पूरा करने के लिए अत्यधिक अनुकूलित किया गया है, स्क्रीनशॉट स्टोरेज आदि के लिए बहुत सी जगह है), और जिस पर मेरा एप्लिकेशन कनेक्ट होता है। हालांकि, मैन्युअल परीक्षण के लिए मुझे आईई में किसी अन्य स्थान पर स्थित v9.2 इंस्टेंस में लॉगिन करने की भी आवश्यकता है। अगर मैंने पहले v9.2 इंस्टेंस में लॉग इन किया था, तो मुझे आईई में v9 इंस्टेंस खोलना होगा और फिर से मेरे ऐप को चलाने से पहले नियंत्रण को फिर से लोड करना होगा ... और अब मैं नहीं करता हूं। :)

1

एक छोटा सा उदाहरण दिखाता है कि अलग-अलग संपत्ति को सही करने के बाद वेब.कॉन्फिग कैसे बदलता है, यह समझने में दूसरों की मदद करेगा कि वास्तव में क्या हो रहा है जब हम पृथक संपत्ति को सत्य पर सेट करते हैं। वीएस वास्तव में आपके कोड में कुछ पंक्तियों में प्रवेश करता है, ताकि यह विशिष्ट सीएलएसआईडी के कॉम डीएल का उपयोग करेगा।

वास्तव में मेरे पास एक ही सर्वर पर दो .NET अनुप्रयोग हैं, जहां एक एप्लिकेशन गुणवत्ता केंद्र 10.0 डीएल का उपयोग करता है और अन्य को गुणवत्ता केंद्र ALM 11.0 में अपग्रेड किया जाता है। तो उसी सर्वर पर हम एक ही नाम के साथ एक डीएलएल पंजीकृत नहीं कर सकते हैं।

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