2009-05-12 14 views
8

के लिए अनियंत्रित किया जा सकता है। मैंने VS2005 का उपयोग करके एक सरल सी # डीएलएल (यह एक बहुत बड़ी परियोजना का हिस्सा है) बनाया है। मुझे एक्सेल में डीएलए कोड के माध्यम से डीएलएल का उपयोग करने की ज़रूरत है, इसलिए मैं असेंबली पर COM इंटरऑप का उपयोग कर रहा हूं। मैं निर्माण प्रक्रिया को स्वचालित रूप से आवश्यक टीएलबी फ़ाइल उत्पन्न करने की कोशिश कर रहा हूं ताकि मुझे कमांड लाइन पर जाने और प्रत्येक निर्माण के बाद regasm का उपयोग करने की आवश्यकता न हो।चेतावनी MSB3391: <DLL> में कोई भी प्रकार नहीं है जिसे COM इंटरॉप

मेरी समस्या यह है कि हालांकि डीएलएल संकलित करता है और ठीक बनाता है, यह एक टीएलबी फ़ाइल उत्पन्न नहीं करता है। इसके बजाए, शीर्षक बॉक्स में त्रुटि आउटपुट बॉक्स में प्रिंट होती है।

मैं अन्य DLLs VS2005 में परियोजना के गुणों पर जाकर TLB फ़ाइलों का निर्माण करने की मिल गया है -> बिल्ड -> आउटपुट ->चेक "COM इंटरॉप के लिए रजिस्टर"। इसके अलावा मेरे पास है [असेंबली: ComVisible (true)] AssemblyInfo.cs में। यहाँ

using System; 
using System.IO; 
using System.Runtime.InteropServices; 
using SymbolTable; 

namespace ProblemLibrary 
{ 
    public class Foo 
    {  
     public Foo(string filename) 
     { 
      ... 
     } 

     // method to read a text file into a SymbolTable 
     public SymbolTable BuildDataSet(string[] selected) 
     { 
      ... 
     } 
    } 
} 

SymbolTable.dll का सार है:

यहाँ समस्या DLL के लिए स्रोत और DLL है कि यह एक वापसी प्रकार के लिए संदर्भ के सारांश है। इसमें रिटर्न प्रकार है जो ProblemLibrary का उपयोग करता है।

using System; 
using System.Collections.Generic; 

namespace SymbolTable 
{ 
    public class SymbolTable 
    { 
     readonly Dictionary<SymbolInfoStub, string> _symbols = new Dictionary<SymbolInfoStub, string>(); 

     /*methods that interact with Dictionary snipped*/ 
    } 
} 
+0

आपको COM इंटरॉप की आवश्यकता क्यों है? मुझे वहां कोई भी कॉम नहीं दिख रहा है। क्या आप बाद में COM के माध्यम से सी # असेंबली तक पहुंचना चाहते हैं? – codeulike

+0

हां, मुझे एक्सेल वीबीए में इस डीएलएल का उपयोग करने की आवश्यकता है। –

उत्तर

18
  1. आपको बिना किसी पैरा के सीटीर होना चाहिए।
  2. कक्षाओं के आस-पास आपके पास GuidAttribute और ProgIdAttribute होना चाहिए।
  3. असेंबली को कॉमविज़िबल (झूठी) के रूप में चिह्नित करना और उन वर्गों को स्पष्ट रूप से चिह्नित करना जिन्हें निर्यात की आवश्यकता है।
  4. अपनी कक्षाओं के लिए इंटरफेस का उपयोग करें।
  5. सुनिश्चित करें कि आपके पास असेंबली स्तर में GuidAttribute है।

    [Guid("<PUT-GUID-HERE-1>")] 
    [ComVisible(true)] 
    interface IFoo 
    { 
        void DoFoo(); 
    } 
    
    [Guid("<PUT-GUID-HERE-2>")] 
    [ComVisible(true)] 
    [ProgId("ProgId.Foo")] 
    class Foo : IFoo 
    { 
        public void DoFoo() 
        { 
        } 
    } 
    
+1

बहुत बढ़िया, बिना किसी पैरामीटर के कन्स्ट्रक्टर ने चाल की। आपका बहुत बहुत धन्यवाद! –

+0

खाली कन्स्ट्रक्टर। वह हमेशा के लिए मुझे परेशान कर रहा है! धन्यवाद। –

+0

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

1

AssemblyInfo.cs फ़ाइल में, सुनिश्चित करें कि आप निम्नलिखित हैं:

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components. If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type. 
[assembly: ComVisible(true)] 

अद्यतन:

पढ़ें: How can I make use of .NET objects from within Excel VBA?

कौन से जोड़ता है: http://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/

+0

जानकारी के लिए धन्यवाद, लेकिन मैंने अपने विवरण में लिखा है कि मेरे पास पहले से ही है। –

+0

मुझे पहले सीओ में काम करने के लिए अन्य सी # डीएलएल मिल गए हैं। हालांकि लिंक ने मुझे अपने मुद्दे से मदद नहीं की, लेकिन मैंने उनसे सी # में COM क्लाइंट इंटेलिजेंस और [क्लासइंटरफेस (क्लासइंटरफेस टाइप.ऑटो डुअल)] के बीच के लिंक के बारे में सीखा। उसके लिए धन्यवाद। –

2

मैं एक ऐसी ही समस्या को देखा।

चेतावनी MSB3391:: मैं की तरह एक त्रुटि मिली किसी भी प्रकार है कि कॉम Interop के लिए अपंजीकृत हो सकता है शामिल नहीं है।

मैंने सभी नियमों (कॉमविज़िबल इत्यादि) का पालन किया लेकिन कुछ भी काम नहीं किया।

समाधान: मुझे डिफ़ॉल्ट कन्स्ट्रक्टर में कुछ डालना पड़ा ताकि इसे अनुकूलित नहीं किया जा सके। जिस क्षण मेरे पास कुछ था, पंजीकरण कोई संदेश के साथ समाप्त हुआ और रजिस्ट्री में घटक दिखाई दे रहा था।

दिलचस्प ध्यान दें: मेरा एक दोस्त उसकी मशीन (64-बिट Windows-7, VS2008-व्यावसायिक, मेरे जैसे) पर खाली डिफ़ॉल्ट निर्माता के साथ मूल DLL रजिस्टर में कामयाब रहे। हालांकि, उनकी Regasm.exe था:

C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Regasm.exe

जबकि मेरा था:

सी: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Regasm.exe

तो यह नेट ढांचे के संस्करणों के बीच कुछ अंतर हो सकता है - हो सकता है बाद के संस्करण भी मीटर के अनुकूलन है uch और REGASM उस के लिए जिम्मेदार नहीं है।

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