Exposing C# struct to COM breaks for VB6 app -


अंतिम अद्यतन: 2009-08-11 2:30 अपराह्न EDT

कुछ दिन पहले मैंने कुछ अजीब समस्याओं के बारे में पोस्ट किया था। ठीक है, मुझे पता चला कि विशेष रूप से एक मशीन पर दूसरे लोगों पर न चलने का निर्माण हो रहा था और यहां तक ​​कि एक काम के आसपास आया था, लेकिन अब यह मुझे एक अच्छा, विशिष्ट प्रश्न के साथ छोड़ देता है: क्यों?

समस्या को पुन: उत्पन्न करने के लिए, मैं एक नया इंटरओपयूज़र कंट्रोल चलाता हूं और निम्न कार्य करता हूं:

  1. एक नया सार्वजनिक स्ट्रेट जोड़ें:
  2. इसे एक GUID दें एट्रिब्यूट
  3. GetMyStruct सदस्य को _InteropUserControl इंटरफ़ेस में जोड़ें और इसे InteropUserControl

    माइस्ट्रॉक्ट :

      [गाइड ("49 ई 803ईई-बीईडी 9 4 ए 080-बी 42 बी-ई0 9 4 9 4 ए 1 9 6")] [कॉमविज़िबल (सच)] सार्वजनिक संरचना माइक्रोसॉफ्ट {सार्वजनिक int mynumber; }  

    _InteropUserControl.GetMyStruct () :

      [DispId (7)] शून्य getMyStruct (int num, ref MyStruct डेटा );  

    (मैंने संदर्भ से गुजरने के बजाय MyStruct वापस करने की कोशिश की है।)

    InteropUserControl.GetMyStruct () < / कोड> कार्यान्वयन:

      सार्वजनिक शून्य getMyStruct (इंट संख्या, रेफरी MyStruct डेटा) {डेटा = नया MyStruct (); Data.mynumber = num * 2; }  

    मैं भी असेंबली पर हस्ताक्षर करता हूं और इसे GAC में स्थापित और रेज़ेसम के साथ पंजीकृत करता हूं। इसे एक नया वीबी 6 प्रोजेक्ट में जोड़कर और GetMyStruct () पर कॉल जोड़ने और हमारी बिल्ड मशीन पर संकलन करने पर, यह अन्य मशीनों पर चलने से इनकार करता है।

    इस के आसपास पाने के लिए, मुझे संरचना के बजाय COM को एक वर्ग का पर्दाफाश करना था, और मूल रूप से GetMyStruct को इस में बदलें:

      सार्वजनिक शून्य GetMyData (int num, MyClass data) {डेटा Mynumber = num * 2; }  

    मेरी वास्तविक परियोजना में, मैं आंतरिक रूप से संरचना को पुनः प्राप्त करता हूं, और फिर क्लाइंट से विधि को पारित किए गए वर्ग के उदाहरण पर संरचना से मेल खाने वाले सभी सदस्यों को फ़ील्ड मानों की प्रतिलिपि बनाएँ ।

    तो क्यों एक संरचना इस व्यवहार और एक वर्ग के लिए ठीक काम किया? VB6 में उपयोग करने के लिए COM के लिए एक स्ट्रेट को उजागर करने के लिए कुछ जादू है?

    मुझे लगता है कि इसमें ओएलई स्वचालन के साथ कुछ हो सकता है।

    नोट: मैंने भी संरचना को वापस लाने का प्रयास किया रिफ़ पैरामीटर का उपयोग करने की तुलना में, लेकिन उसने व्यवहार को नहीं बदला।

    प्रोजेक्ट टेम्पलेट पर लिंक जोड़ने के लिए संपादित करें:

    मूल VB.NET प्रोजेक्ट टेम्पलेट और डीएलएल है। मैं dll का संदर्भ नहीं देता है, इसलिए आपको इसे स्थापित करने की आवश्यकता नहीं हो सकती है।

    वह है जो मैंने मेरा (प्रोजेक्ट टेम्पलेट, आइटम टेम्पलेट नहीं) बनाने के लिए उपयोग किया था। VB.NET संस्करण __ इंटरॉपयूसर कंट्रोल इवेंट इंटरफ़ेस, _InteropUserControl इंटरफ़ेस, और कुछ प्रासंगिक विशेषताओं को स्वचालित रूप से उत्पन्न करता है उनको स्पष्ट रूप से सी # संस्करण में कोडित किया गया है, और यह उन दोनों के बीच के सभी के बीच है।

मुझे लगता है मुझे इस समस्या का समाधान मिला मेरे पास एक ही सटीक समस्या थी, एक संरचना को पारित करते हुए एक इंटरॉप लाइब्रेरी की विधि बुलाते समय vb6 विराम। यह एक प्रोजेक्ट है जिसे मैं डीएलएल इंटरॉप के परीक्षण के लिए बनाया था, इसलिए मेरे प्रोजेक्ट में मेरे पास एक फॉर्म था। लेकिन मेरे पास एक अन्य प्रोजेक्ट (मुख्य एप्लिकेशन) है, जो उसी संदर्भ से है और यह ठीक काम करता है।

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

इसलिए, मैंने अपने फॉर्म से कोड लिया और उसे एक मॉड्यूल में एक सार्वजनिक उप में स्थानांतरित किया । यह तुरंत काम किया वैसे, इस तरह मैंने मुख्य एप्लिकेशन में कॉल को लागू किया था जो ठीक से काम कर रहा था।

मुझे आशा है कि यह दूसरों की मदद करेगी।


Comments

Popular posts from this blog

c# - ListView onScroll event -

PHP - get image from byte array -

Linux Terminal Problem with Non-Canonical Terminal I/O app -