2013-03-05 6 views
7

से बाहर यह समस्या मुझे कुछ दिनों के लिए सिरदर्द पैदा कर रही है, और मुझे इसके लिए कोई कारण नहीं मिल रहा है। मुझे पूरा यकीन है कि यह मेरी मशीन के लिए विशेष रूप से एक पर्यावरणीय मुद्दा है, लेकिन फिर भी यह मुझे परीक्षण के साथ समस्याएं पैदा कर रहा है।64 बिट प्रकार लाइब्रेरी और 32 बिट प्रकार पुस्तकालय सिंक

मैं विजुअल स्टूडियो 2010 पेशेवर का उपयोग कर सी # में डीएलएल बना रहा हूं। संस्करण एक नीचे है;

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace TestCOM 
{ 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [System.Runtime.InteropServices.ComVisible(true)] 
    [System.Runtime.InteropServices.ProgId("TestCOM.Class1")] 
    [System.Runtime.InteropServices.Guid("803A1B2F-1CDA-4571-9084-87500388693B")] 
    public class Class1 
    { 
     public void showMessage() 
     { 
      MessageBox.Show("Hello from TextCom"); 
     } 

    } 
} 

यह असेंबली ठीक संकलित करता है, और सब कुछ अच्छा है। मैं इसे एक COM ऑब्जेक्ट के रूप में पंजीकृत करने के लिए निम्न स्क्रिप्ट चलाता हूं (पहले 32-बिट के लिए, फिर 64-बिट के लिए);

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe TestCOM.dll /codebase /nologo /tlb:TestCOM32.tlb 
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe TestCOM.dll /codebase /nologo /tlb:TestCOM64.tlb 

और फिर परीक्षण करने के लिए निम्न स्क्रिप्ट का उपयोग करें;

dim tc 
set tc = CreateObject("TestCOM.Class1") 
tc.showMessage() 

मैं csript का उपयोग स्क्रिप्ट का परीक्षण करने के, तो मैं नियंत्रित कर सकते हैं जो बिट गहराई इसे इस्तेमाल करता है - मैं इसे 32-बिट के साथ एक बार परीक्षण करने और एक बार 64-बिट के साथ। अब तक सबकुछ अच्छा है।

अब, जब मैं एक समारोह को जोड़ने के लिए, के रूप में

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace TestCOM 
{ 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [System.Runtime.InteropServices.ComVisible(true)] 
    [System.Runtime.InteropServices.ProgId("TestCOM.Class1")] 
    [System.Runtime.InteropServices.Guid("803A1B2F-1CDA-4571-9084-87500388693B")] 
    public class Class1 
    { 
     public void showMessage() 
     { 
      MessageBox.Show("Hello from TextCom"); 
     } 

     public void HelloWorld() 
     { 
      MessageBox.Show("Hello World!!"); 
     } 

    } 
} 

इस प्रकार संशोधन करने से पहले मूल विधानसभा संशोधित करने, मैं "regasm/अपंजीकृत" का उपयोग पुस्तकालय अपंजीकृत और यह अपंजीकृत सफलतापूर्वक सभी प्रकार की सूचना दी।

जब मैं लाइब्रेरी पंजीकृत करता हूं, अब परिवर्तनों के साथ, मूल परीक्षण स्क्रिप्ट पूरी तरह से काम करती है। यदि मैं नया हैलोवर्ल्ड फ़ंक्शन कॉल करने के लिए टेस्ट स्क्रिप्ट का विस्तार करता हूं;

32-बिट स्क्रिप्ट में, यह पूरी तरह से काम करता है। 64-बिट स्क्रिप्ट में, यह शिकायत करता है कि TestCOM.Class1 ऑब्जेक्ट

के लिए ऐसा कोई फ़ंक्शन मौजूद नहीं है, मैंने इसे हर तरह से करने की कोशिश की है, लेकिन मैं यह नहीं पहचान सकता कि नया फ़ंक्शन 32-बिट के लिए क्यों उपलब्ध है कॉलर्स, लेकिन 64-बिट कॉल नहीं।

मैं क्या गलत कर रहा हूं? 64-बिट सामग्री के लिए कहीं कैश है, मुझे पता नहीं है, या एक रजिस्ट्री सेटिंग बदलने की जरूरत है?

स्पष्ट होने के लिए; 1. विधानसभा बिल्ड 2. रजिस्टर regasm का उपयोग कर, 32 के लिए एक बार और एक बार 64 3. टेस्ट के लिए स्क्रिप्ट का उपयोग कर - सब कुछ काम करता है 4. अपंजीकृत पुस्तकालय 5. संशोधन करें, प्रति चरण 2 7 के रूप में पुनर्निर्माण 6. रजिस्टर टेस्ट 32-बिट में काम करते हैं, लेकिन 64 नहीं। डब्ल्यूटीएफ?

उत्तर

2

स्पष्ट रूप से आप डीएलएल नरक से पीड़ित हैं, हमेशा COM के साथ, यह आपके डीएलएल का पुराना संस्करण लोड कर रहा है। आपके जीएसी पहले प्रयोगों से प्रदूषित हो सकता था, यह हमेशा पहले जीएसीएड संस्करण पाएगा। आप [ग्विड] को निर्दिष्ट करके इसे और भी खराब कर रहे हैं, जिससे आपकी नई कक्षा पुराने जैसा दिखती है, भले ही यह समान न हो। COM को आपको यह बताने से रोकना कि यह कक्षा का नया संस्करण नहीं ढूंढ सकता है।

सबसे विश्वसनीय, हालांकि शोर, यह देखने के लिए कि डीएलएल कहां से आया है, SysInterals 'ProcMon उपयोगिता का उपयोग कर है। आप इसे रजिस्ट्री कुंजी पढ़कर और डीएलएल लोड कर देखेंगे। आप देख सकते हैं कि यह किस निर्देशिका से आया था। सुनिश्चित करें कि यह जीएसी नहीं है, अगर यह मामला है, तो इसे gacutil/u से हटा दें, और सुनिश्चित करें कि आपको फ़ाइल पर टाइमस्टैम्प की जांच करके इसे पुनर्निर्मित किया गया है।

+0

आप पूर्ण किंवदंती। ऐसा लगता है कि किसी कारण से, डीएल के पहले के निर्माण की एक प्रति सी में थी: \ windows \ system32 उस प्रतिलिपि को तुरंत समस्याओं को हल करने, किसी भी चीज को फिर से पंजीकृत करने की आवश्यकता नहीं है, आदि .. धन्यवाद - यह देखने के लिए कि यह क्या हो रहा था, यह देखने के लिए मेरे साथ कभी नहीं हुआ। एक अंतिम प्रश्न - क्या आप कह रहे हैं कि मुझे GUID निर्दिष्ट नहीं करना चाहिए? मुझे हमेशा बताया गया था कि आपको करना था? – DFriend

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