C#.NET समर्थन IDispatch देर बाध्यकारी है?




late-binding (4)

आपको सी # 4.0 के लिए इंतजार करना होगा कि आप देर से बंधन प्राप्त करने के लिए बाहर निकल सकते हैं जिसे आप ढूंढ रहे हैं। किसी भी समय मुझे इंटरॉप क्षमताओं की ज़रूरत है मैं VB.Net मोड पर वापस स्विच करता हूं, इसलिए मैं COM क्षमताओं का लाभ ले सकता हूं जो C # की कमी है

मैं जिस साधारण विधि का उपयोग करता हूँ, वह VB.Net में एक क्लास का निर्माण कर रहा है जो आईडीआईएसपैच काम करता है और फिर उन विधियों को उजागर करता है जो मैं अपने आवरण के तरीकों के रूप में उपयोग करना चाहता हूं और फिर मैं उन्हें अपने सी # कोड से इच्छा पर कॉल कर सकता हूं। समाधानों की सबसे खूबसूरत नहीं, लेकिन पिछले कुछ महीनों में मुझे एक जाम या दो से बाहर निकाल दिया गया है।

प्रश्न

मेरा सवाल है: क्या C # nativly देर से बाध्यकारी IDispatch का समर्थन करता है?

बहाना मैं कार्यालय को स्वचालित करने की कोशिश कर रहा हूं, जबकि ग्राहक ने जो भी संस्करण इंस्टॉल किया है उसके साथ संगत रहना।

यदि आपने Office 2000 के साथ विकसित किया है, तो हर डेवलपर, और हर ग्राहक, अब तक समय के अंत तक, Office 2000 के पास होना आवश्यक है।

दुनिया में एनएटी से पहले, हमने कॉम का इस्तेमाल कार्यालय एप्लीकेशन से करने के लिए किया था।

उदाहरण के लिए:

1) संस्करण स्वतंत्र प्रागैड का उपयोग करें

"Excel.Application"

जो निम्न को हल करता है:

clsid = {00024500-0000-0000-C000-000000000046}

और फिर COM का उपयोग करते हुए, हम इन कक्षाओं में से एक के लिए एक ऑब्जेक्ट में तत्काल होने की मांग करते हैं:

IUnknown unk;
CoCreateInstance(
    clsid, 
    null,
    CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
    IUnknown, 
    out unk);

और अब हम दौड़ के लिए रवाना हो रहे हैं - अपने आवेदन के अंदर से Excel का उपयोग करने में सक्षम। बेशक, यदि वास्तव में आप ऑब्जेक्ट का उपयोग करना चाहते हैं, तो आपको फोन करने के तरीकों का कोई तरीका कॉल करना होगा।

हम विभिन्न इंटरफ़ेस घोषणाओं का लाभ उठा सकते हैं, हमारी भाषा में अनुवाद कर सकते हैं। यह तकनीक अच्छी है क्योंकि हमें मिलती है

  • प्रारंभिक बाध्यकारी
  • कोड-अंतर्दृष्टि
  • संकलित प्रकार वाक्यविन्यास जांच

और कुछ उदाहरण कोड हो सकता है:

Application xl = (IExcelApplication)unk;
ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
Worksheet worksheet = workbook.ActiveSheet;

लेकिन इंटरफेस का उपयोग करने का एक नकारात्मक पक्ष है: हमें अपनी भाषा में स्थानांतरित विभिन्न इंटरफ़ेस घोषणाओं का लाभ प्राप्त करना होगा। और हम सभी मापदंडों को निर्दिष्ट करने के लिए, विधि आधारित आविष्कारों का उपयोग कर फंस रहे हैं, उदाहरण के लिए:

ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid);
xl.Worksheets.Add(before, after, count, type, lcid);

यह साबित कर दिया है, वास्तविक दुनिया में, ऐसे निराशा होने के लिए जिसे हम स्वेच्छा से छोड़ देंगे:

  • प्रारंभिक बाध्यकारी
  • कोड-अंतर्दृष्टि
  • समय सिंटैक्स जांच संकलन

और इसके बजाय आईडीआईएसपैच देर से बंधन का उपयोग करें:

Variant xl = (IDispatch)unk;
Variant newWorksheet = xl.Worksheets.Add();

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

नोट: मैं एक्सेल के अपने उदाहरण को भ्रमित न करें कि मैं आईडीआईपैच का उपयोग क्यों करना चाहता हूं। प्रत्येक COM ऑब्जेक्ट Excel नहीं है कुछ COM ऑब्जेक्ट्स को IDispatch के अलावा कोई समर्थन नहीं है


सी # 4 के dynamic कीवर्ड का समर्थन IDispatch और देर से बाध्यकारी है। आप अधिक जानकारी के लिए सैम एनजी की गतिशील श्रृंखला पढ़ सकते हैं

ओह, और सी # 4 केवल आज ही एक सीटीपी के रूप में उपलब्ध है आपको या तो विजुअल स्टूडियो vNext के लिए इंतजार करना होगा या उसका उपयोग करने के लिए बीटा (जो कि एक विंडोज़ सर्वर 2008 वर्चुअल पीसी पर चलता है) का उपयोग करना होगा।


संभवतः आप सी # 2.0 / 3.0 में बहुत अच्छे कोड के साथ भाग ले सकते हैं यदि आप एक अंतरफलक लिखने के लिए समय लेते हैं जिसमें आप ऑब्जेक्ट के गुणों और गुणों को चाहते हैं और कुछ विशेषताओं को जोड़ते हैं (मैं इसे स्मृति से लिखता हूं, इसलिए विवरण नहीं हो सकता है सही है, लेकिन मैं कसम खाता हूँ यह मेरे लिए काम किया ...)

    using System.Runtime.Interopservices;

    [Guid("00024500-0000-0000-C000-000000000046")]
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    interface IExcel
    {
      // sample property
      string Name{get;}
      // more properties
    }

    // and somewhere else
    void main()
    {
      Object xl = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
      IExcel excel = (IExcel)xl;
      string name = xl.name
    }

जैसा कि बताया गया है, कोड बॉक्स के बाहर काम नहीं करेगा, यह अधिक संकेत है कि एमएसडीएन में किस प्रकार खोदना है।


हे ड्यूड, मेरे पास इस समस्या को हल करने के लिए वर्तमान में 2 कोडप्लेक्स प्रोजेक्ट हैं I

सबसे पहले लेटबैंगिंग एपीआई एक्सलेक्स http://excel.codeplex.com की नकल की गई है, देर से बन्द किए गए कॉल को प्रसिद्ध वस्तु मॉडल में बुलाते हैं। यह निम्नलिखित परियोजना के लिए एक परीक्षण परियोजना थी

दूसरा, एक CodeGenerator है http://latebindingapi.codeplex.com उपकरण सी प्रकार पुस्तकालयों से सी # परियोजनाएं बनाता है। जनरेटेड प्रोजेक्ट्स में मेपर ऑब्जेक्ट्स के साथ में कॉम सर्वर तक पहुंचने वाले लेटबिंड शामिल हैं हाइलाइट यह है कि उपकरण अलग-अलग संस्करणों में एक प्रकार की एकल प्रोजेक्ट (उदाहरण के लिए एक्सेल 9, 10, 11) में कॉम प्रकार के लिब्स को परिवर्तित करता है और एक स्वयं परिभाषित सहयोगी पुस्तकालय विशेषता के साथ सभी संस्थाओं को चिह्नित करता है। मैंने इस कार्यालय के साथ 9,10,11,12,14 संस्करण में सभी कार्यालय एप्लिकेशन का विश्लेषण किया है और एसी # समाधान उत्पन्न किया है, इसका मुख्य भाग पर नमूना कोड के साथ परीक्षण बीटा के रूप में उपलब्ध है।







idispatch