2011-08-09 13 views
6

मैंने देखा है कि यदि मैं एक .NET घटक बनाता हूं जो एक ऐरेलिस्ट को उजागर करता है, तो वह ऐरेलिस्ट COM इंटरऑप के माध्यम से गुजरता है और वीबीस्क्रिप्ट जैसे स्क्रिप्ट भाषाओं में उपलब्ध है।यह क्यों है कि ArrayList COM Interop के साथ काम करता है, लेकिन IList <T> नहीं है?

जेनिक्स, जैसे IList<T> काम नहीं लग रहा है।

यह क्यों है और एक सामान्य प्रकार को सफलतापूर्वक COM इंटरऑप के माध्यम से एक स्क्रिप्टिंग इंजन में प्रवाह करने का कोई तरीका है?

+2

क्योंकि COM जेनरिक का समर्थन नहीं करता है। [इस] पर एक नजर डालें (http://stackoverflow.com/questions/1862497/c-exposing-class-to-com-generic-collections) और [इस] (http://stackoverflow.com/questions/ 269581/क्या-विकल्प-से-जेनेरिक-संग्रह-के-कॉम-इंटरऑप) प्रश्न। –

उत्तर

5

जेनिक्स .NET 2.0 में जोड़े गए थे और COM .NET 1.0 से पहले मौजूद था।
(और प्रौद्योगिकी नेट उद्देश्य से को बदलने के लिए किया गया था।)

कॉम जेनरिक नहीं था, और इसलिए आप उन्हें का खुलासा नहीं कर सकते हैं।
COM भाषाओं में से कोई भी नहीं (सी ++, वीबी 6, डेल्फी) जेनेरिक था ताकि आप उन्हें उपभोग करने की उम्मीद न कर सकें।
(ठीक है, सी ++ था टेम्पलेट्स लेकिन वे पूरी तरह से एक अलग जानवर हैं, और COM केवल इंटरफेस। मतलब)

संग्रह उजागर के रूप में एक ArrayList इस समस्या का solution, आप इसे चारों ओर काम नहीं कर सकता है।

अस्वीकरण: मैं तो जवाब के बाकी मोटे तौर पर मेरा अनुमान पर आधारित है कॉम पर कोई विशेषज्ञ हूँ।

कॉम कभी नहीं था "" ArrayList है, सच है, लेकिन अभी यह कभी नहीं किसी भी .NET फ्रेमवर्क में कक्षाओं के था, क्योंकि यह एक ढांचे में ही नहीं है। हालांकि, कुछ .NET प्रकार निर्यात प्रकार पुस्तकालयों में आते हैं, और कुछ नहीं करते हैं। .NET फ्रेमवर्क कक्षाओं के बारे में क्या? खैर, ArrayList[ComVisible] है, और List<T> नहीं है।

क्यों?

COM works via interfaces, और इंटरफेस परिभाषा भाषा में जेनेरिक के बारे में कोई जानकारी नहीं है और उनका समर्थन नहीं करता है। COM का समर्थन करने वाली भाषाएं, जैसे वीबी 6 या सी ++, जेनिक्स के साथ क्या करना है, यह नहीं पता।

अगर वहाँ एक तरह से List<T> के लिए एक इंटरफेस उत्पन्न करने के लिए था, यह नहीं उस में T शामिल तो वहाँ अनिवार्य रूप से एक सामान्य प्रकार का पर्दाफाश करने की कोशिश में कोई मतलब नहीं है जाएगा। इसके लिए संभावित काल्पनिक विकल्प होंगे:

  • सामान्य प्रकार के लिए इंटरफ़ेस का "विशिष्ट" संस्करण उत्पन्न करना, उदा। IListOfStringList<string>
  • जेनेरिक प्रकार की जानकारी (जैसे जावा संकलन पर करता है) को मिटाकर को object के साथ बदलना।

पहला विकल्प व्यवहार्य क्योंकि ठोस T प्रकार संकलन पर ज्ञात नहीं हो सकता नहीं है (पढ़ें: प्रतिबिंब), और List<T> उस पर एक [ComVisible] विशेषता वैसे भी जरूरत नहीं है।

दूसरा विकल्प वास्तव में एक तरह से संभव है क्योंकि आप कर सकते हैं provide your own class interface with IList and ICollection properties है:

[ComVisible(true)] 
public interface IPerson 
{ 
    string Name { get;set;} 
    DateTime Entered { get;set;} 
    IList NickNamesList { get;} 
    ICollection NickNamesCollection { get;} 
} 

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
[ComDefaultInterface(typeof(IPerson))] 
public class Person:IPerson 
{ 
    [ComVisible(false)] 
    public List<string> NickNames 
    { 
     get { return _NickNames; } 
     set { _NickNames = value; } 
    } 
    private List<string> _NickNames = new List<string>(); 

    #region IPerson Members 
    IList IPerson.NickNamesList 
    { 
     get { return this.NickNames; } 
    } 

    ICollection IPerson.NickNamesCollection 
    { 
     get { return this.NickNames; } 
    } 
    #endregion 
    .... 
} 

यह एक समाधान नहीं है और हालांकि आपके प्रश्न का उत्तर नहीं देता है।

मैं वास्तव में सोच रहा हूं कि क्या आप StringList कक्षा List<string> से प्राप्त कर सकते हैं और इसे [ComVisible(true)] के रूप में चिह्नित कर सकते हैं। आप इसे देखना चाह सकते हैं।

+0

मैं इसे स्वीकार नहीं कर सकता। माइक्रोसॉफ्ट ने ऐरेलिस्टिस्ट काम किया (COM में कभी भी ऐरेलिस्ट नहीं थे) - इसलिए किसी भी तरह से अन्य प्रकार के काम करना संभव होना चाहिए। जेनरिक के पास रनटाइम पर ठोस प्रकार होते हैं। एक एर्रेलिस्ट काम करने वाली तंत्र क्या है? –

+0

मैं COM पर कोई विशेषज्ञ नहीं हूं लेकिन मैंने अपने कुछ अनुमानों को शामिल करने के लिए उत्तर संपादित किया है। –

+0

के लेट बाइंडिंग मान लेते हैं (IDispatch) और देखते हैं कि चीजों पर एक अलग तिरछा डालता है। हर नेट प्रकार कार्यावधि में एक ठोस प्रकार है, इसलिए जब तक लेट बाइंडिंग COM घटक से इस्तेमाल किया जाता है, यह ठोस प्रकार एक सामान्य से ली गई 'देख' के लिए सक्षम होना चाहिए। यह देखते हुए कि COM का अपना प्रकार का सिस्टम है, .NET प्रकारों और COM प्रकारों के बीच कुछ रूपांतरण आवश्यक है। मैं आज कुछ पढ़ने कर रहा हूँ और अब मुझे आश्चर्य है कि अगर यह एक कस्टम marshaller उपयोग करने के लिए 'बेनकाब' करने के लिए COM के लिए एक क्रियाशील प्रकार संभव हो सकता है? कॉम की मेरी जानकारी है, हालांकि वास्तव में कमजोर है, इसलिए मैं वास्तव में सिर्फ अंधेरे में शूटिंग कर रहा हूँ। –