2012-09-23 29 views
8

मैं वीबी 6 में लिखित एक बड़ी परियोजना को सी # में परिवर्तित करने की प्रक्रिया में हूं। परियोजना के आकार को स्थानांतरित करने के आकार को देखते हुए, यह 18 महीनों के दौरान चरणों में किया जा रहा है। मैं एक .NET प्रोजेक्ट में VB6 ActiveX dll का संदर्भ जोड़ने के साथ किसी समस्या में भाग रहा हूं।विजुअल स्टूडियो में एक वीबी 6 संदर्भ जोड़ने से "टाइप लाइब्रेरी आयातक टाइप प्रकार सत्यापन के दौरान एक त्रुटि आई"

यदि आप इन चरणों का पालन करते हैं, तो आप भी समस्या को फिर से बनाने में सक्षम होना चाहिए।

मैं नेट में एक अंतरफलक है कि कॉम दिख रहा है लिखा है:

<ComVisible(True)> 
Public Interface ITestInterface 
    Property A As String 
    Function TestMethod() As String 
End Interface 

का चयन करके परियोजना संपत्तियों की संकलित टैब में "COM इंटरॉप के लिए रजिस्टर", आप एक TLB फ़ाइल मिलता है।

मैंने एक वीबी 6 प्रोजेक्ट बनाया है जो इस टीएलबी और एक वर्ग का संदर्भ देता है जो इंटरफ़ेस का खुलासा करता है।

Implements ITestInterface 

Private mA As String 

Public Property Get ITestInterface_A() As String 
    ITestInterface_A = mA 
End Property 

Public Property Let ITestInterface_A(ByVal value As String) 
    mA = value 
End Property 

Public Function ITestInterface_TestMethod() As String 
    ITestInterface_TestMethod = "From VB6" 
End Function 

अगर मैं "दूरस्थ सर्वर फ़ाइलें" फिर एक TLB स्वचालित रूप से संकलन बनाई गई है उपयोग करने के लिए VB6 में परियोजना संपत्तियों के घटक टैब निर्धारित किया है। मैं OleView में है कि TLB देख सकते हैं और निम्नलिखित (ठोस कार्यान्वयन इंटरफ़ेस नेट परियोजना में परिभाषित की VB6 में किया के विवरण के अलावा) देख सकते हैं:

// typelib filename: TestVB6Interface.dll 

[ 
    uuid(**EF005573-BFC7-436D-A382-F906CA09F94A**), 
    version(3.0) 
] 

// ... some other stuff 

// TLib :  // TLib : : {79EC733A-0267-4506-8D38-C4D4655E0755} 
importlib("SimpleDotNetLibrary.tlb"); 

अब, मैं एक पूरी तरह से नया बना सकते हैं। नेट प्रोजेक्ट

COM संदर्भ को हल नहीं किया जा सका "ef005573-bfc7-436d-a382-f906ca09f94a" संस्करण 3.0: मैं VB6 dll के लिए एक संदर्भ जोड़ दें, तो मैं निम्नलिखित त्रुटि मिलती है। प्रकार सत्यापन के दौरान टाइप लाइब्रेरी आयातक को एक त्रुटि आई। कक्षा के सदस्यों के बिना आयात करने का प्रयास करें।

हालांकि, अगर मैं एक दृश्य स्टूडियो कमांड प्रॉम्प्ट का शुभारंभ और चलाने के निम्नलिखित:

tlbimp TestVB6Interface.tlb /out:TestVB6Interface.MyInterop.dll 

तब मैं अपने नेट समाधान में एक संदर्भ के रूप कि dll जोड़ सकते हैं और यह पूरी तरह से ठीक काम करता है।

मेरा प्रश्न। कमांड लाइन पर tlbimp क्या कर रहा है जो तब नहीं किया जा रहा है जब मैं सीधे संदर्भ जोड़ूं? जब विजुअल स्टूडियो में संदेश "वर्ग के सदस्यों के बिना आयात करने का प्रयास करता है" तो मैं दृश्य स्टूडियो के भीतर वास्तव में ऐसा कैसे करूं? मुझे पता है कि tlbimp में ऐसा कैसे करें।

मैं पाठ की दीवार के लिए क्षमा चाहता हूं, लेकिन मैं स्थिति का वर्णन करना चाहता था क्योंकि मैं जो जानकारी महसूस करता हूं वह मुझे प्रासंगिक था।

+0

क्या आपने कभी यह पता लगाया है? – JMK

+0

हमने किया (थोडा)। .NET इंटरफ़ेस को लागू करने वाली VB6 क्लास को "विशेषता VB_Exposed = False" पर सेट करने की आवश्यकता है इसका मतलब है कि यह टीएलबी में नहीं है या वीबी 6 डीएलएल के बाहर खुलासा नहीं है, लेकिन अभी भी .NET इंटरफ़ेस की अपेक्षा COM पर खुलासा किया जा सकता है (और यह वही है जिसे हम वास्तव में वैसे भी चाहते हैं)। यह लक्षण तय करता है (त्रुटि दूर हो जाती है!), लेकिन निश्चित रूप से मेरे प्रश्न में संबोधित मूल समस्या को ठीक नहीं किया क्योंकि यह समाधान हर किसी के लिए काम नहीं कर सकता है। –

+0

शुद्ध जिज्ञासा से पूछने के लिए काफी उचित, उत्तर के लिए धन्यवाद! – JMK

उत्तर

2

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

मुझे संदेह है कि माइक्रोसॉफ्ट ने इसे कहीं भी दस्तावेज किया है। हालांकि, मेरे वर्षों के अनुभव ने यह मामला साबित कर दिया है। मैं एक बार ऐसी परिस्थिति में भाग गया जिसमें .NET 2.0 फ्रेमवर्क से "regsvcs" कमांड वास्तव में एक अनंत लूप का कारण बनता है। यदि आप इसे Google करते हैं तो आपको शायद उन अन्य लोगों को मिल जाएगा जिनके पास यह समस्या है। मैं एक .NET सर्विस्ड घटक के COM पंजीकरण करने के लिए वीएस आईडीई का उपयोग करके इसे एक कदम आगे बढ़ाने में सक्षम था। हालांकि, यह अनिवार्य रूप से त्रुटि में समाप्त हो गया। त्रुटि अनंत लूप पर एक कदम आगे था। किसी भी तरह से यह साबित हुआ कि COM इंटरऑप और रजिस्ट्री प्रविष्टियों से निपटने के दौरान वीएस आईडीई एक अलग कोड पथ/व्यावसायिक तर्क लेता है।

+0

यह करता है। यदि कोई चेतावनी है तो यह टीएलबी आयात नहीं करेगा। कंसोल पर Tlbimp.exe प्रदर्शित होने वाली चेतावनियों की तरह और अक्सर अनदेखा किया जा सकता है क्योंकि वे सौम्य हैं। दे या ले। –