2009-07-23 16 views
33

मेरे पास सी # में लिखा गया एक साधारण वर्ग पुस्तकालय है।एक सरल सी # डीएलएल - मैं इसे एक्सेल, एक्सेस, वीबीए, वीबी 6 से कैसे कॉल करूं?

using System; 
namespace TestDll 
{ 
    public class Test 
    { 
     public string HelloWorld 
     { 
      get 
      { 
       return "Hello World"; 
      } 
     } 
    } 
} 

मेरा प्रश्न कैसे मैं माइक्रोसॉफ्ट ऑफिस विजुअल बेसिक (जो मुझे लगता है कि VB6 है) से इस HelloWorld फ़ंक्शन को कॉल कर सकते हैं?

मेरा पहला कदम डीएलएल को एक संदर्भ के रूप में जोड़ना था - लेकिन संकलित डीएलएल को ब्राउज़ करने और चुनने पर संदेश "निर्दिष्ट फ़ाइल का संदर्भ नहीं जोड़ सकता।" फेंका गया था।

क्या कोई मुझे सही दिशा में इंगित कर सकता है कि यह कैसे काम/कैसे प्राप्त किया जाए?

अग्रिम धन्यवाद!

+0

इंटरऑप टैग के लिए डिलिमपोर्ट टैग को स्वैप करना ... – Ant

उत्तर

47

आप COM इंटरऑप के माध्यम से एक स्थिर सदस्य तक नहीं पहुंच सकते हैं। वास्तव में आपका कोड संकलित भी नहीं करता है, विधि कक्षा में होनी चाहिए। यहां बताया गया है कि आप इसे कैसे कर सकते हैं:

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("01A31113-9353-44cc-A1F4-C6F1210E4B30")] //Allocate your own GUID 
public interface _Test 
{ 
    string HelloWorld { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[Guid("E2F07CD4-CE73-4102-B35D-119362624C47")] //Allocate your own GUID 
[ProgId("TestDll.Test")] 
public class Test : _Test 
{ 
    public string HelloWorld { get { return "Hello, World! "; } } 
} 

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

तो यह उपभोग करने के लिए:

Dim o : Set o = CreateObject("TestDll.Test") 
MsgBox o.HelloWorld 

तुम भी dll का संदर्भ और जल्दी बंधन का उपयोग कर सकते हैं:

Dim o As TestDll.Test 
Set o = New TestDll.Text 
MsgBox o.HelloWorld 
+0

धन्यवाद एंथनीWJones, वास्तव में एक अच्छा जवाब - मैं इस उत्तर को पोस्ट करने के बाद से खोज रहा हूं - सिवाय इसके कि मुझे एक इंटरफ़ेस घोषित करना था! बहुत बहुत धन्यवाद!! – divinci

+0

यह इंटरफ़ेस घोषित किए बिना किया जा सकता है लेकिन मैं इसे अनुशंसा नहीं करता, विशेष रूप से COM क्लाइंट द्वारा उपभोग करने वाले इंटरफ़ेस का उपयोग करके ऐसा करने का एक बेहतर तरीका है। – AnthonyWJones

+0

धन्यवाद एंथनी, क्या आप पोस्ट किए गए फॉलोअप उत्तर की आलोचना करते हैं? – divinci

0

AnthonyWJones के अच्छे जवाब देने के लिए जोड़ने के लिए, आप भी अपने DLL पंजीकरण करना होगा Regasm.exe का उपयोग कर जो आवश्यक रजिस्ट्री प्रविष्टियों को जोड़ता है।

+0

क्षमा करें, ध्यान नहीं दिया कि एंथनी WJones पहले ही Regasm का उल्लेख किया था। –

19

और विभिन्न कंप्यूटरों पर डीएलएल पंजीकृत करने पर विस्तार करने के लिए।

एक बार जब आप संकलित करके उसे अपने विकास मशीन पर उपरोक्त कोड का निर्माण, यदि आप

परियोजना गुण टैब का निर्माण किया है, COM इंटरॉप के लिए रजिस्टर का चयन करें।

आपके विजुअल स्टूडियो आउटपुट फ़ोल्डर (आमतौर पर बिन \ डीबग) जहां संकलित * .dll पाया जाता है, में * .tlb फ़ाइल भी होगी।

यह * .tlb फ़ाइल एक 'टाइप लाइब्रेरी' है। और क्लाइंट मशीन द्वारा आपके * .dll में अलग-अलग 'प्रकार' को समझने और मूल रूप से क्लाइंट मशीन को इसका उपयोग करने के तरीके को समझने के लिए आवश्यक है।

उपरोक्त 'COM इंटरऑप के लिए रजिस्टर' सेट करके - * .tlb फ़ाइल के उत्पादन के रूप में, असेंबली (डीएल) आपकी मशीन पर पंजीकृत है, और इसलिए पहुंच योग्य है।

VBA में आप अब

VBA संपादक द्वारा एक संदर्भ के रूप में इस फ़ाइल जोड़ सकते हैं -> उपकरण -> संदर्भ -> ब्राउज़ -> का चयन करें

इस आप तो घोषित करने के लिए अनुमति देगा आपकी पुस्तकालय में पाए गए वर्ग।

Dim TestClass As Test 
Set TestClass = New Test 
MsgBox TestClass.HelloWorld 

हालांकि - उस मशीन पर विधानसभा (dll) रजिस्टर करने के लिए - आप तो एक अलग क्लाइंट मशीन पर अपने dll उपयोग करना चाहते हैं, तो आप Regasm.exe का उपयोग करना होगा।

यह कमांड लाइन से किया जा सकता,

Regasm.exe

इस मामले

Regasm.exe TestDll.dll

एक बार में आपने नई क्लाइंट मशीन पर असेंबली पंजीकृत की है, आप वाई इसके * .tlb

पर एक संदर्भ जोड़कर इसे फिर से एक्सेस करने में सक्षम हो जाएगा उम्मीद है कि इससे मदद मिलती है!

+0

हाँ मुझे लगता है कि आपको अच्छी तरह से कवर किया गया है – AnthonyWJones

+0

क्या आप डेवलपर मशीन या क्लाइंट मशीन पर regasm चलाते हैं? क्योंकि मेरी क्लाइंट मशीन में .NET स्थापित नहीं है। – Alexey

+0

एलेक्सी .NET DLL को क्लाइंट मशीन पर चलाने के लिए नेट फ्रेमवर्क की आवश्यकता होगी। – divinci

6

बस टिप्पणी करना चाहता था कि विजुअल स्टूडियो 2008 में, .tlb फ़ाइल जेनरेट करने के लिए आपको एप्लिकेशन के तहत भी जाना होगा। विधानसभा सूचना और "असेंबली COM दृश्यमान" चुनें। मुझे यह खोजने के लिए थोड़ी देर लग गई, इसलिए उम्मीद है कि यह दूसरों की मदद करेगी।

+1

+1 धन्यवाद, धन्यवाद, धन्यवाद! पहले बहुत ही काम किया, फिर बंद कर दिया, अब यह करने के बाद काम कर रहा है, भगवान जानता है कि आगे क्या होता है, लेकिन कम से कम यह अब के लिए काम कर रहा है। यहां VS2010 का उपयोग करना, अभी भी प्रासंगिक है। –

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