2009-11-11 10 views
6

मेरे पास एक .NET DLL है (जो सी ++/सीएलआई में लिखा जाता है)। इसके कुछ हिस्सों मैं COM के माध्यम से बेनकाब करना चाहता हूँ। मैं ऐसा करता हूं और इसे "regasm my.dll/codebase" का उपयोग करके पंजीकृत करता हूं। अब तक सब ठीक है। लेकिन फिर मैं कुछ चीजें और असेंबली परिवर्तनों की संस्करण संख्या बदलता हूं और साथ ही मैं डीएल को एक अलग फ़ोल्डर में ले जाता हूं। मैं इसे फिर से पंजीकृत करता हूं और ओएलई/कॉम व्यूअर में मेरी COM ऑब्जेक्ट को देखता हूं। मैं इस तरहRegasm के माध्यम से पंजीकृत कई संस्करणों के साथ .NET/COM कैसे काम करता है?

 
InprocServer32 [Codebase] = file://c://foo/bar/my.dll 
7.0.0.0 [Class] = My.Blah.Class 
7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234 
7.0.0.0 [RuntimeVersion] = v2.0.50727 
7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll 
7.0.0.27397 [Class] = My.Blah.Class 
7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234 
7.0.0.27397 [RuntimeVersion] = v2.0.50727 
7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll 

एकाधिक संस्करणों के बारे में प्रश्न कुछ देखें:

  1. तो मुझे लगता है कि पिछले कॉम उद्देश्य यह है कि पंजीकृत किया गया था जीत। इससे कोई फर्क नहीं पड़ता कि मेरे पास मेरी पुरानी 7.0.0.0 COM ऑब्जेक्ट पंजीकृत है, 7.0.0.27397 वह है जिसे बनाया जाएगा जब मैं अपने COM ऑब्जेक्ट को तुरंत चालू करता हूं क्योंकि मैंने इसे अंतिम बार पंजीकृत किया था। क्या वो सही है?

  2. ओह, मैंने 7.0.0.0 ऑब्जेक्ट को नहीं रखा था। क्या इससे छुटकारा पाने का कोई तरीका है? रजिस्ट्री में जाने और इसे हाथ से मारने के अलावा किसी COM ऑब्जेक्ट के सभी संस्करणों को हटाने का कोई तरीका है?

  3. जिज्ञासा से बाहर, अगर मैं विशेष रूप से अपने COM ऑब्जेक्ट के किसी विशेष संस्करण को तुरंत चालू करना चाहता हूं तो ऐसा करने का कोई तरीका है? (यदि आप कोड उदाहरण देना चाहते हैं तो मैं सी ++ का उपयोग कर रहा हूं)।

  4. क्या कोई तरीका है कि मैं केवल संस्करण संख्या को स्टोर न करने के लिए विनियम कह सकता हूं क्योंकि यह चीजों को अव्यवस्थित करने लगता है और मैं नहीं देख सकता कि लाभ क्या है। यदि मेरा COM ऑब्जेक्ट महत्वपूर्ण एपीआई परिवर्तन के माध्यम से चला गया तो मैं सिर्फ GUID और प्रोगिड को बदल दूंगा, है ना? क्या होगा यदि मैं एकाधिक संस्करणों को पंजीकृत नहीं करना चाहता (मुझे नहीं)।

उत्तर

5

मैं हमेशा इस कारण के लिए एक स्थिर असेंबली वर्जन के साथ अपने COM दृश्य असेंबली सेट करता हूं। यदि आप किसी संस्करण के साथ टैग की गई बाइनरी चाहते हैं, तो इसके बजाय असेंबलीफाइलवर्सन का उपयोग करें।

  1. अंतिम पंजीकृत वस्तु जीत: हां
  2. नहीं वास्तव में। आप सफाई को स्वचालित करने के लिए अपनी असेंबली के कॉमरेजिस्टर फंक्शन/कॉम्यून्रेस्टर फंक्शन विशेषता विधियों में सामान डाल सकते हैं, लेकिन यदि आप पुराने संस्करण ड्रॉपिंग को छोड़ देते हैं, तो यह एकमात्र तरीका है।
  3. आप इसे एक अलग कोक्लस GUID और/या प्रोगिड (उदाहरण के लिए, MyCoClass.1, .2, आदि) के साथ करेंगे। CoCreateInstance को संस्करण मानों के बारे में कुछ भी पता नहीं है- इसका उपयोग सीएलआर के एक्टिवेटर द्वारा किया जाता है ताकि यह सुनिश्चित किया जा सके कि यह सही असेंबली लोड हो।
  4. कोई भी सबसे अच्छी बात यह नहीं है कि आपका असेंबली संस्करण कभी भी न हो (ऊपर देखें)।
+0

मुझे सबूत देख रहे हैं कि COM हमेशा कई संस्करणों के साथ पंजीकृत घटक के उच्चतम क्रमांकित संस्करण को उठाता है, अंतिम पंजीकृत संस्करण नहीं। क्या कोई इसकी पुष्टि कर सकता है? – BlueMonkMN

0

उसी सीएलएसआईडी के साथ घटक संगत होना चाहिए, खासकर यदि आपने केवल असेंबली के बीच बिल्ड नंबर बदल दिया है। यहां केवल relevant चीज है जिसे मैंने जल्दी से googling द्वारा पुष्टि करने के लिए पाया है।

आपके प्रश्नों का उत्तर देने के लिए सीधे:

  1. सही।
  2. regasm/unregister
  3. Binding redirects में देखें।
  4. शायद नहीं।

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

  • कोई संबंधित समस्या नहीं^_^