2008-09-29 9 views
11

मुझे एक सी # असेंबली मिली है जिसे मैं डेल्फी (win32 देशी) एप्लिकेशन से COM के माध्यम से आमंत्रित कर रहा हूं।regasm.exe गलत सीआईडी ​​के साथ मेरी सी # असेंबली क्यों पंजीकृत करता है?

यह उन सभी मशीनों पर काम करता है जिन्हें मैंने परीक्षण किया है, एक को छोड़कर।

समस्या यह है कि COM ऑब्जेक्ट बनाने की कोशिश करते समय डेल्फी एप्लिकेशन "क्लास पंजीकृत नहीं" हो जाता है।

अब, जब मैं HKEY_CLASSES_ROOT\DelphiToCSharp\CLSID के तहत रजिस्ट्री में देखता हूं, तो सूचीबद्ध सूचीबद्ध GUID AssemblyInfo.cs में असेंबली ग्रिड जैसा नहीं है। यह वही होना चाहिए - यह अन्य सभी कंप्यूटरों पर समान है जहां यह स्थापित है।

मैंने regasm /unregister delphitocsharp.dll को आजमाया है, और यह रजिस्ट्री कुंजी को हटा देता है। फिर यदि मैं regasm delphitocsharp.dll करता हूं, तो रजिस्ट्री कुंजी लौटाती है, लेकिन GUID पहले (यानी गलत) जैसा ही है, और डेल्फी को अभी भी "क्लास पंजीकृत नहीं है" मिलता है।

कार्य मशीन पर DelphiToCSharp.dll गैर-काम करने वाली मशीन पर संस्करण के समान (एमडी 5 के साथ सत्यापित) समान है।

मैं सोच सकता हूं कि डीएलएल का पुराना संस्करण पहले पंजीकृत था, और वहां अभी भी उस फ़ाइल के कुछ अवशेष मौजूद हैं जो भ्रमित हो रहा है।

मैं इस मुद्दे को कैसे ठीक या निदान कर सकता हूं?

उत्तर

12

असेंबलीइन्फो में GUID "टाइप-लाइब्रेरी" GUID बन जाता है और आमतौर पर वह नहीं है जिसे आप ढूंढ रहे हैं। मुझे लगता है कि आप कक्षा तक पहुंचने की कोशिश कर रहे हैं, और आपको कक्षा के लिए एक ग्रिड विशेषता और कॉमविज़िबल को परिभाषित करने की आवश्यकता है। उदाहरण के लिए:

[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]  
public class MyCOMRegisteredClass 

आप, तो वर्ग या तो एक) पंजीकृत नहीं है, तो नहीं होगा, या ख) यदि आप विधानसभा स्तर पर) द्वारा निर्धारित किए गए COMVisible (सच है, एक GUID आवंटित किया जाएगा कि .NET आपके लिए बेक है।

1

शायद आपके पास कहीं भी असेंबली का पुराना संस्करण है? शायद जीएसी में? रेजिमम शायद इसे उठा रहा है और इसका उपयोग कर रहा है।

+0

यह जीएसी में नहीं हो सकता है, क्योंकि मेरी असेंबली पर हस्ताक्षर नहीं है। अच्छा बिंदु हालांकि, मैं फ़ाइल की अन्य प्रतियों की खोज करूंगा। – Blorgbeard

+0

.Net की असेंबली लोडिंग Win32 के रूप में कई निर्देशिकाओं में डीएल का पता नहीं लगाती है, इसलिए शायद ही मामला हो सकता है। –

1

शायद आपके पास सिस्टम पर कहीं भी वही (पुराना संस्करण) डीएल की एक प्रति है, उसी फ़ाइल की प्रतियों के लिए डिस्क खोजें और नई प्रतिलिपि पंजीकृत करने से पहले उन्हें मैन्युअल रूप से हटाएं (बैकअप)।

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