2011-12-21 17 views
11

के लिए इनएट्रिब्यूट और आउटएट्रिब्यूट का उपयोग करने के लिए आवश्यक/उचित कब है, मैं COM इंटरऑप परिभाषाओं की गड़बड़ी के माध्यम से जाने की कोशिश कर रहा हूं, जिसे हमने विभिन्न परियोजनाओं में बिखराया है और उन्हें एक एकल, ज्ञात-अच्छे स्थान में एकत्रित किया है, जिसमें से संपूर्ण देव टीम लाभ उठा सकते हैं। इस प्रयास के भाग में वर्षों से जमा की गई परिभाषाओं को साफ करना शामिल है।COM इंटरऑप

इनमें से कुछ को अन्य स्रोत कोड से उधार लिया जाता है, कुछ को पिनवोक.net से वर्बैटिम कॉपी किया गया था, और कुछ सीधे एसडीके शीर्षकों से अनुवादित होने लगते हैं। एक बात मुझे पता है कि विभिन्न marshalling विशेषताओं का उपयोग करने के बारे में कोई स्थिरता नहीं है, (pinvoke.net उदाहरणों में भी यह बहुत हिट-या-मिस है)। समस्या का एक हिस्सा यह है कि, मुझे नहीं लगता कि यहां कोई भी (स्वयं शामिल) पूरी तरह समझता है जब विभिन्न विशेषताओं की आवश्यकता होती है या नहीं, या वे वास्तव में क्या करते हैं। इस बिंदु तक, इन अधिकारों को प्राप्त करने के लिए अनुमान लगाना और यादृच्छिक परिवर्तनों का संयोजन होना प्रतीत होता है जब तक कि कॉमेक्सप्सेप्शन बंद नहीं हो जाता है, लेकिन मुझे लगता है कि अनुवाद सही होंगे क्योंकि किसी ने वास्तव में उन्हें देखा और उन्हें घोषित किया।

तो, मैं [In] और [Out] से शुरू कर रहा हूं। मुझे पता है कि ये दो गुण अवधारणात्मक रूप से क्या करते हैं: वे मार्शलर को सूचित करते हैं कि डेटा को किस दिशा में जाना है। I मान लीजिए मार्शलर, उदाहरण के लिए, [In] डेटा को कॉलर पर वापस कॉपी करने से परेशान नहीं होगा, या जानता है कि [Out] डेटा को कैली साइड आदि पर मुक्त करने की आवश्यकता हो सकती है। जिन चीजों को मैं नहीं जानता, वे हैं:

  1. यह गुणों का उपयोग करने के लिए आवश्यक है? यही है, डिफ़ॉल्ट मार्शलिंग व्यवहार कब गलत है कि गुण इसे सही बनाते हैं?
  2. इन गुणों का उपयोग करने के लिए सुरक्षित सुरक्षित है? यही है, यह निर्दिष्ट करेगा कि मार्शलर जिस तरह से काम करता है, वह डिफ़ॉल्ट व्यवहार क्या हो सकता है?
  3. इन गुणों का उपयोग करने के लिए खतरनाक कब है? मुझे लगता है कि आउटपुट पैरामीटर को स्पष्ट रूप से चिह्नित करना [In] खराब है, लेकिन इनपुट पैरामीटर [In, Out] को वास्तव में कुछ भी तोड़ने जा रहा है?

तो, एक काल्पनिक COM इंटरफ़ेस विधि जिसका आईडीएल इस तरह दिखता दिया:

HRESULT Foo(
    [in] ULONG a, 
    [out] ULONG * b 
    [in, out] ULONG * c); 

मैं इस निम्न में से किसी के रूप में अनुवाद देख सकते हैं:

void Foo(
    uint cb, 
    out uint b, 
    ref uint c); 

void Foo(
    uint cb, 
    [Out] out uint b, 
    [In, Out] ref uint c); 

void Foo(
    [In] uint cb, 
    [Out] out uint b, 
    [In, Out] ref uint c); 

वहाँ किसी भी कार्यात्मक अंतर है उन तीनों के बीच? क्या उनमें से किसी को तकनीकी सुधार के अलावा अन्य कारणों से "बेहतर" माना जाता है?

+2

यहां सावधान रहें, आप सेब और संतरे की तुलना कर रहे हैं। एक आईडीएल फ़ाइल में [इन] और [आउट] विशेषताएँ केवल midl.exe द्वारा उपयोग की जाती हैं जब यह प्रॉक्सी/स्टब कोड उत्पन्न करती है। जिसका उपयोग तब किया जाता है जब एक COM कॉल को अपार्टमेंट या प्रक्रियाओं के बीच मार्शल किया जाना चाहिए। .NET [इन] और [आउट] विशेषताओं का उपयोग केवल पिनवोक मार्शलर द्वारा किया जाता है। जो एक बहुत ही अलग रनटाइम पर्यावरण में चलता है, हमेशा प्रक्रिया में और अपार्टमेंट के लिए किसी भी सम्मान के बिना। कॉल का अनुकूलन, उनका इरादा निश्चित रूप से वही है। –

+1

हां, मैं (मुझे लगता है) इस भाग को समझते हैं। मेरे उद्देश्यों के लिए, आईडीएल से सी # का अनुवाद करते समय, मैं केवल आईडीएल विशेषताओं का उपयोग इस संकेत के रूप में करता हूं कि तरीकों को "माना जाना" व्यवहार कैसे किया जाता है। आईओएल, आईडीएल में [आउट] विशेषता का अर्थ है कि इंटरफ़ेस लेखक इस पैरामीटर को कॉलर से वापस आने वाले मान के साथ वापस आने का इरादा रखता है, इसलिए मुझे यह सुनिश्चित करना होगा कि सी # कोड उसी तरह कार्य करता है। जहां मैं छोटा हो रहा हूं, .NET marshaller के डिफ़ॉल्ट व्यवहार को समझ रहा है और जब मुझे यह बताने की ज़रूरत है कि बनाम क्या करना है। जब यह सही चीज करता है। –

+2

वे आईडीएल में आवश्यक हैं क्योंकि यह पूरी तरह अस्पष्ट है कि जब आप पॉइंटर्स का उपयोग करते हैं तो डेटा प्रवाह दिशा क्या होती है। * रेफरी * और * आउट * कीवर्ड के साथ सी # में कोई समस्या नहीं है। 99% अच्छा मामला बस सी # में विशेषताओं को छोड़ रहा है। 100% यदि आप वास्तव में सी # के साथ COM कोड बदल रहे हैं। –

उत्तर

14

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

मूलतः, वे निम्नलिखित सी # कीवर्ड समकक्ष है:

  • आप डिफ़ॉल्ट रूप से [In] मिलता है।
  • ref कीवर्ड आपको [In, Out] प्राप्त करता है।
  • out कीवर्ड आपको [Out] प्राप्त करता है।

सभी एक अच्छी तालिका here में प्रलेखित।

आपको केवल उन लोगों का उपयोग करने की आवश्यकता है जब आप उन अंतर्निहित अर्थशास्त्र को बदलना चाहते हैं या मार्शलर के डिफ़ॉल्ट व्यवहार को बदलना चाहते हैं। उदाहरण के लिए, आप ref घोषित पैरामीटर को [In] विशेषता के साथ केवल मार्शलिंग के "आउट" हिस्से को दबाने के लिए चिह्नित कर सकते हैं।

उसने कहा, मुझे लगता है कि मैं स्वयं उनका उपयोग कर रहा हूं क्योंकि वे कोड स्वयं-दस्तावेज़ बनाने का एक बहुत ही आसान तरीका हैं।

+0

मुझे स्वयं-वृत्तचित्र विचार पसंद है! और बस जोड़ना: बूल और स्ट्रिंग्स के लिए मार्शलएज़ का उपयोग अधिक प्रासंगिक है, इन्हें भी जांचें ... – eFloh

+0

हाँ, मैं मार्शल एट्रिब्यूट से अधिक परिचित हूं, हालांकि वहां कुछ विवरण हैं जो मैं अभी भी अस्पष्ट नहीं हूं (ज्यादातर सरणी के साथ)। मैं सरल शुरू कर रहा था :) –

+0

आह, वास्तव में पिनवोक.net पर मुझे कुछ दिखाई देता है! उदाहरण के लिए, यदि कोई विधि एक REFIID पैरामीटर लेती है, तो आमतौर पर यह "रेफ ग्रिड" होगा। लेकिन यदि पैरामीटर को आईडीएल में [इन] के रूप में नामित किया गया है, तो मैं इसे "[इन] रेफ ग्रिड रिफाइइड" के रूप में नामित कर सकता हूं और यह मुझे वापस ग्रिड संरचना के लिए परेशान नहीं करेगा क्योंकि मुझे इसकी आवश्यकता नहीं है, सही ? –

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