2010-06-08 16 views
9

काम नहीं करेगा मैंने सी # का उपयोग करके एक .NET असेंबली लिखा है जो प्रबंधित और अप्रबंधित कोड दोनों द्वारा उपयोग किया जाएगा। मेरे पास एक वीबी 6 प्रोजेक्ट है जिसे अब COM के माध्यम से असेंबली का उपयोग करने की आवश्यकता है।वीबी 6 में .NET असेंबली का संदर्भ

मैंने अपनी .net असेंबली बनाई, सुनिश्चित किया कि कॉमविज़िबल सत्य पर सेट है और यह प्रोजेक्ट गुणों के माध्यम से COM इंटरऑप के लिए पंजीकृत है।

public class MyClass 

    [ComVisible(true)] 
    public string GetResponse() 
    { 
     return "Testing Response" 
    } 

} 

मैं असेंबली का निर्माण करता हूं और फ़ाइल को फ़ोल्डर में कॉपी करता हूं। TestInterop.dll

फिर मैं COM के लिए ऑब्जेक्ट पंजीकृत करने के लिए असेंबली टूल पंजीकृत करने के लिए बैच फ़ाइल चलाता हूं।

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\ 
regasm "c:\Program Files\TestApp\TestInterop.dll" /tlb:TestInterop.tlb 

मैं एक नया VB6 आवेदन और संदर्भ TestInterop.dll

VB6 में मैं निम्नलिखित कोड लिखने और इसे संकलित खोलें।

Dim obj as TestInterop.MyClass 
Set obj = new TestInterop.MyClass 

Dim strTest as string 

strTest = obj.GetRespose() 

जब मैं प्रोग्राम चलाता हूं तो यह obj.GetResponse() लाइन पर त्रुटियों को चलाता है।

Run-time error' -2147024894 (80070002'): 
Automation error 
The system cannot find the file specified 

इसके अलावा, इंटेलिजेंस obj पर काम नहीं करता है। मुझे GetResponse विधि टाइप करना पड़ा। क्या यह सामान्य है?

क्या किसी के पास कोई संकेत है कि क्या गलत हो सकता है या मुझे कौन से कदम याद आए। धन्यवाद!

उत्तर

11

आप जीएसी में अपनी .NET असेंबली डालना चाहते हैं या फिर/codebase कमांड लाइन स्विच के साथ RegAsm चला सकते हैं (यह शिकायत करेगा, लेकिन यह कम से कम काम करेगा)। दुर्भाग्यवश, कोई इंटेलिजेंस सामान्य नहीं है।

+0

एक आकर्षण की तरह काम किया।बहुत धन्यवाद! मैं/codebase कमांड का उपयोग कर regasm उपकरण चला गया।/Codebase भी आपके लिए tlb फ़ाइल बनाता है। आपके उत्तरों के लिए हर एक का धन्यवाद। – dretzlaff17

4

पिछली बार मैंने देखा कि मैं GUID को हार्ड-कोड करना भूल गया था। इसलिए हर बार जब मैं वीबी का पुन: संकलित करता हूं तो मेरा कोड नहीं ढूंढ पाएगा। यह वीबीएनईटी से एक टेम्पलेट है। (। इन GUIDs का उपयोग न करें, अपना खुद का बनाएँ)

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ 
Public Class ComClass1 

#Region "COM GUIDs" 
    ' These GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class. 
    Public Const ClassId As String = "eaf83044-f0a7-417b-b333-e45aec398ca5" 
    Public Const InterfaceId As String = "84e0fb8f-266d-40e6-9e8c-3d4eb37d3bf0" 
    Public Const EventsId As String = "22ea2214-032f-4eb6-b2d4-c5dd213bab87" 
#End Region 

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject. 
    Public Sub New() 
     MyBase.New() 
    End Sub 

End Class 
0

मुझे लगता है, tlb फ़ाइल इस निर्देशिका के खिलाफ के रूप में ढांचे निर्देशिका के अंतर्गत उत्पन्न होता है (ग: \ Program Files \ TestApp)।

क्या यह समस्या हो सकती है?

1

मैं देखा है कि आप RegAsm मैन्युअल रूप से चलाने के लिए की जरूरत नहीं है, वास्तव में सिर्फ सही करने के लिए संपत्ति ComVisible AssemblyInfo सेट:

[विधानसभा: ComVisible (सही)]

तुम भी ऐसा कर सकते हैं परियोजना गुणों पर जा रहे हैं -> आवेदन -> विधानसभा सूचना -> असेंबली COM दृश्यमान बनाएं, और चेक बॉक्स सेट करें।

वीबी 6 से इसका उपयोग करने के लिए जीएसी में आपके द्वारा बनाई गई असेंबली को पंजीकृत करने की आवश्यकता नहीं है।

0

मुझे -2147024894 त्रुटि, या अन्य त्रुटियों का कोई फर्क नहीं पड़ता कि मैंने कोशिश की, जब तक कि मैं सीधे exe से vb6 उपभोक्ता कोड नहीं चलाता। वीबी 6 डीबगर के बारे में कुछ जो मुझे रनटाइम पर डीएलएल का उपयोग करने की अनुमति देने से रोक रहा था। मैं वस्तु को तुरंत चालू नहीं कर सका। मैं डिजाइन समय पर टीएलबी का संदर्भ दे सकता था, और सही इंटेलिजेंस समर्थन भी था। जैसे ही मैंने विजुअल स्टूडियो के बाहर एप्लिकेशन लॉन्च किया, सबकुछ पूरी तरह से काम करता था। उम्मीद है कि यह किसी की मदद करता है।