2009-11-04 15 views
8

से .NET 3.0 कोड निष्पादित करें। मैंने .NET 3.0 ढांचे का उपयोग कर सी # में एक डीएलएल बनाया है।Office 2003

नीचे मेरी DLL का कोड

namespace CompanyName.Net 
{ 
    [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ProgId("CompanyName.Net.Webrequest")] 
    public class WebRequest 
    { 
     public string Result { get; private set; } 
     public string Url { get; set; } 
     public string StatusDescription { get; private set; } 
     public HttpStatusCode StatusCode { get; private set; } 

     public WebRequest() 
     { 
      //explicit constructor 
     }  

     public string GetResponse(string url) 
     { 
      System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); 
      HttpWebResponse response = (HttpWebResponse) webreq.GetResponse(); 
      // Store the status. 
      StatusDescription = response.StatusDescription; 
      StatusCode = response.StatusCode; 
      // Get the stream containing content returned by the server. 
      Stream dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader(dataStream); 
      // Read the content. 
      Result = reader.ReadToEnd(); 
      // Cleanup the streams and the response. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
      //return the response 
      return Result; 
     } 
    } 
} 

मैं Office 2003 VBA कोड से चलाने के लिए इस कोड को प्राप्त करने की कोशिश कर रहा हूँ है। डिफ़ॉल्ट विजुअल स्टूडियो 2008 हस्ताक्षर का उपयोग कर डीएलएल पर हस्ताक्षर किए गए थे।

मैं

regasm /tlb c:\CompanyName.Net.dll 

का उपयोग कर एक .tlb फ़ाइल बनाने के द्वारा मेरे विधानसभा संदर्भ में कामयाब रहे लेकिन है कि जब मैं वस्तु का एक उदाहरण बनाना चाहते हैं:

Private Sub Command0_Click() 
    Dim o As Object 
    Set o = CreateObject("CompanyName.Net.WebRequest") 
    Dim s As String 
    s = o.GetResponse("http://www.google.be") 
    MsgBox s 
End Sub 

मैं निम्नलिखित त्रुटि मिलती है :

ActiveX component can't create Object

मैं क्या गलत कर रहा हूं?

जिस मशीन के साथ मैं परीक्षण कर रहा हूं वह .NET 3.5 ढांचे तक स्थापित है।

उत्तर

10

ठीक है, थोरस्टन डिट्टमार के कुछ अच्छे विचारों के बाद मुझे अंत में यह काम करने के लिए मिला। कुछ चीजें हैं जो हमारी चर्चा और अन्य बातों के दौरान आया था मैं वेब पर पाया:

  1. .NET फ़्रेमवर्क लक्ष्य मशीन पर स्थापित किया जाना चाहिए।
  2. नेट प्रोग्राम योग्यता समर्थन लक्ष्य मशीन पर स्थापित करने की आवश्यकता है।
  3. AssemblyInfo.cs में आप

    [assembly: ComVisible(true)]

  4. सेट Thorsten के रूप में बताया है कि आप अपने नेट कक्षा में parameterless सार्वजनिक निर्माता की आवश्यकता है सुनिश्चित करें।

  5. अपने प्रोजेक्ट के प्रॉपर्टी पेज पर बिल्ड टैब में "COM इंटरऑप के लिए रजिस्टर" की जांच करना सुनिश्चित करें।
  6. अपने प्रोजेक्ट के प्रॉपर्टी पेज पर साइनिंग टैब का उपयोग करके अपने प्रोजेक्ट पर हस्ताक्षर करना सुनिश्चित करें।
  7. इस आदेश को चलाकर लक्ष्य मशीन पर अपना डीएलएल पंजीकृत करें। /कोडबेस पैरामीटर मेरे लिए चाल करना प्रतीत होता था। टाइप लाइब्रेरी (.tlb) या DLL का पथ कोई फर्क नहीं पड़ता। आप सेल्सियस पर regasm पा सकते हैं: \ Windows \ Microsoft.Net \ फ्रेमवर्क \ v2.050727 \ Regasm.exe

    regasm c:\CompanyName.Net.dll /tlb:CompanyName.Net.tlb /codebase

  8. संदर्भ अपने VBA संपादक में .tlb फ़ाइल उपकरण> संदर्भ का उपयोग करते हुए।

  9. सी: \ से अपने जीएसी में सी: \ विंडोज \ असेंबली \ पर डीएल खींचें (मुझे पहले यह नहीं पता था लेकिन स्पष्ट रूप से कार्यालय के लिए आपकी असेंबली ढूंढना आवश्यक है।)

यह चाल चलाना चाहिए।

मैंने इसके लिए एक इंटरफेस जोड़कर अपनी वेबरेक्वेस्ट क्लास को अपग्रेड किया, इस प्रकार वीबी 6 में IntelliSense समर्थन सक्षम किया गया (जो दुख की बात है कि वीबीए में पर्याप्त काम नहीं करता है)।

+0

यह इस समस्या पर सबसे संक्षिप्त और एकमात्र पूर्ण मार्गदर्शिका है जिसे मैंने काम करने के लिए प्रयास करने के कुछ घंटों बाद पाया। धन्यवाद। –

2

आपको अपनी COM कक्षा में एक स्पष्ट पैरामीटर रहित कन्स्ट्रक्टर की आवश्यकता है। अपनी कक्षा परिभाषा को बदलें:

namespace CompanyName.Net 
{ 
    [Guid("F7075E8D-A6BD-4590-A3B5-7728C94E372F")] 
    [ClassInterface(ClassInterfaceType.AutoDual)] 
    [ProgId("CompanyName.Net.Webrequest")] 
    public class WebRequest 
    { 
     public string Result { get; private set; } 
     public string Url { get; set; } 
     public string StatusDescription { get; private set; } 
     public HttpStatusCode StatusCode { get; private set; } 

     public WebRequest() 
     { 
     } 

     public string GetResponse(string url) 
     { 
      System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); 
      HttpWebResponse response = (HttpWebResponse) webreq.GetResponse(); 
      // Store the status. 
      StatusDescription = response.StatusDescription; 
      StatusCode = response.StatusCode; 
      // Get the stream containing content returned by the server. 
      Stream dataStream = response.GetResponseStream(); 
      // Open the stream using a StreamReader for easy access. 
      StreamReader reader = new StreamReader(dataStream); 
      // Read the content. 
      Result = reader.ReadToEnd(); 
      // Cleanup the streams and the response. 
      reader.Close(); 
      dataStream.Close(); 
      response.Close(); 
      //return the response 
      return Result; 
     } 
    } 
} 

यह काम करना चाहिए।

+0

मैंने अभी कोशिश की लेकिन यह अभी भी मुझे एक ही त्रुटि देता है। मैंने अपनी परियोजना को "COM इंटरऑप के लिए पंजीकरण" के रूप में चिह्नित किया लेकिन कोई खुशी नहीं। हो सकता है कि जिस तरह से मैं वीबीए में अपना काम बुला रहा हूं वह गलत है? मैं एक नुकसान में हूँ – Peter

+0

क्या आपने डीएलएल को फिर से पंजीकृत किया था? –

+0

मैंने tlb फ़ाइल को फिर से बनाया है जिसे डीएलएल को पुनः पंजीकृत करना चाहिए। मैं इसे फिर से जीएसी में जोड़ने का प्रयास कर सकता हूं? – Peter

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