c# - How does on marshal class parameters to COM methods? -


मेरे पास VBSrpt में एक क्लास परिभाषित है:

  क्लास फू पब्लिक आई एंड क्लास   

जिनमें से मैं COM ऑब्जेक्ट को सी # में लिखी गई एक उदाहरण देना चाहता हूं:

  मंद oCOMTEST: सेट oCOMTEST = CreateObject ("COMTests.Class1") मंद OFoo: सेट ओफू = नया फ़ू ओफ़ू.आई = 42 कॉल oCOMTEST.M (ओफू)  

विधि एम इस प्रकार परिभाषित की गई है:

 सार्वजनिक शून्य एम (रेफ ऑब्जेक्ट foo)  

वर्तमान में विधि को एक वस्तु की अपेक्षा है लेकिन मुझे विधि का सी # फू । दूसरों के बीच में मैंने वस्तु से फ़ू ,

  [StructLayout (LayoutKind.Sequential)] सार्वजनिक वर्ग फू [[मार्शलएएस UnmanagedType.U4)] सार्वजनिक int i; }  

लेकिन सफलता के बिना। इसलिए मेरा सवाल है:

VBScript प्रकार Foo की तरह marshaled सी # संस्करण कैसे दिखता है?

- < / P>

यह मेरा न्यूनतम परीक्षण का मामला है।

  सिस्टम का उपयोग करें। Runtime.InteropServices; नाम स्थान COMTests {[ComVisible (सही)] [Guid ( "4624071F-2D98-4ECC-8898-558F4D24EEC9")] [InterfaceType (ComInterfaceType.InterfaceIsDual)] सार्वजनिक इंटरफ़ेस IClass1 {शून्य एम (रेफरी वस्तु foo); } [ComVisible (सही)] [Guid ( "9F2B6958-742F-4E5D-A5F3-D6BDC6C841DB")] [ClassInterface (ClassInterfaceType.None)] [PROGID ( "COMTests.Class1")] सार्वजनिक वर्ग Class1: IClass1 {सार्वजनिक शून्य एम (रेफ ऑब्जेक्ट foo) {System.Diagnostics.Debugger.Launch (); }}}  

और निम्नलिखित VBScript:

  मंद oCOMTEST: सेट oCOMTEST = CreateObject ( "COMTests.Class1") मंद oFoo: सेट oFoo = नई Foo oFoo.i = 42 कॉल oCOMTEST.M (ओफू) क्लास फू पब्लिक आई एंड क्लास  

< P> VBScript वर्ग एक पूर्ण COM ऑब्जेक्ट नहीं है क्योंकि इसके पास कोई आईआईडी (इंटरफ़ेस आईडी) नहीं है। इसलिए, मैं गलत हो सकता है, लेकिन मुझे नहीं लगता कि आप इसे एक। NET वर्ग या इंटरफेस (कई विशेषताओं जैसे कि ComImport से जुड़े GUID विशेषता की उम्मीद कर सकते हैं) हो सकता है। यह काम कर सकता है यदि Foo को "वास्तविक" COM ऑब्जेक्ट से बनाया गया था पृष्ठभूमि में, मुझे विश्वास है कि वीबीस्क्रिप्ट की फू ऑब्जेक्ट केवल IDispatch लागू करता है, इसलिए यह स्वभाव से बहुत गतिशील है।

हालांकि, आप अभी भी अपनी संपत्तियों और metods का उपयोग सी # के साथ आसानी से कर सकते हैं उदाहरण के लिए, निम्न कोड को काम करना चाहिए:

  [कॉमवेज़िबल (सच्चे)] [गाइड ("9 एफ 2 बी 6958-742 एफ -4 ए 5 डी-ए 5 एफ 3 -D6BDC6C841DB ")] [ProgId (" COMTests.Class1 ")] सार्वजनिक वर्ग कक्षा 1 {सार्वजनिक शून्य एम (गतिशील फू) {Console.WriteLine (" foo: "+ foo.i); }}  

पुनश्च: आपको इस संदर्भ में इंटरफ़ेस या रेफ़ ऐट्रिब्यूट की ज़रूरत नहीं है। ऊपर मेरी कोड के साथ, यह है कि क्या नेट द्वारा स्वचालित रूप से बनाया जाएगा है (आईडीएल मामले में, एक सा पठनीयता के लिए सरलीकृत):

  [UUID (E66DC08B-A63A-41A8-B63D-15ED6F4569AB) , संस्करण (1.0),] पुस्तकालय कक्षा पुस्तकालय 1 {इंटरफ़ेस _Class1; [यूयूआईडी (9 एफ 2 बी 6958 -742 एफ -4 ई 5 डी-ए 5 एफ 3-डी 6 बीडीसी 6 सी 841 डीबी), संस्करण (1.0),] कोकलेस क्लास 1 [[डिफ़ॉल्ट] इंटरफ़ेस _Class1; इंटरफ़ेस _ ऑब्जेक्ट; }; [ओडल, यूयूआईडी (एफ 56 एएफ़ 0 एफसी-डी 3 9 बी -39 9 ई -8 एफबीडी-9 बी 72 सीएफ 50 डी 7 डी 9), छिपी हुई, दोहरी, ऑलियोटोमेशन,] इंटरफ़ेस _Class1: आईडीसीपैच {}; };  

Comments

Popular posts from this blog

import - Python ImportError: No module named wmi -

Editing Python Class in Shell and SQLAlchemy -

c# - MySQL Parameterized Select Query joining tables issue -