2012-06-07 22 views
6

हमारी परियोजना में हम अपने एएसपीनेट एप्लिकेशन में COM के माध्यम से बहुत सारे डेल्फी कोड का पुन: उपयोग कर रहे हैं।.NET में पी/Invoke पर COM इंटरऑप क्यों पसंद किया जाता है?

इस तरह

: विरासत डेल्फी dll => डेल्फी COM आवरण => नेट इंटरॉप => asp.net (MVC)

हम पहुँच उल्लंघन, dll के की उतराई, आदि के बारे में कुछ मुद्दों है ... मेरे पास है अब पी/Invoke कोड के माध्यम से सीधे विरासत डीएलएल का उपयोग करने के लिए कुछ पोर्ट किया।

जब मैं COM और P/Invoke से संबंधित संसाधनों को देखता हूं, तो लोग लगभग हमेशा COM का उपयोग करने की सलाह देते हैं। ऐसा क्यों है? क्या नहीं पी/आह्वान निम्नलिखित फायदे हैं:

  • चेक आउट कोड हमेशा पिछले पंजीकृत कॉम के बजाय सही dll का उपयोग करेगा
  • एकाधिक संस्करण (उदाहरण के लिए सर्वर पर कंधे से कंधा मिलाकर चला सकते हैं : देव, परीक्षण और गुणवत्ता आश्वासन)
  • कोई और अधिक COM पंजीकरण परेशानी
  • कॉम संचार (लेख मैं एक 30% की गति में वृद्धि से संकेत मिलता है पढ़ने के लिए) की तुलना में बहुत तेजी से
+0

क्या आप 64 बिट प्रक्रिया से 32 बिट डीएल में पी/इनवॉक कर सकते हैं? मुझे ऐसा नहीं लगता। – Bond

+1

क्या आप कुछ संदर्भ दे सकते हैं जो सुझाव देते हैं कि COM को P/Invoke को प्राथमिकता दी जाती है? मैं आपसे बहुत सहमत हूं कि पी/Invoke उपलब्ध बेहतर समाधान है। .NET बीसीएल में अधिकांश इंटर्न पी/Invoke Win32 एपीआई के संदर्भ में लागू किया गया है। COM इंटरऑप का उपयोग करने का केवल एक कारण है जहां आपके पास कोई विकल्प नहीं है, उदा। Office अनुप्रयोगों, या Windows API भागों के साथ इंटरऑप करें जो केवल COM हैं। – Govert

+0

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

उत्तर

8

PInvoke एक बहुत अच्छा उपकरण है लेकिन यह निश्चित रूप है n ओ COM के लिए विकल्प। पिनवोक केवल सी सिंटैक्स के साथ सरल कार्यों का समर्थन करता है, COM आपको ऑब्जेक्ट मॉडल को लागू करने देता है। उदाहरण के लिए माइक्रोसॉफ्ट.ऑफिस.इंटरोप नामस्थान में कक्षाएं लें, वे सभी शुद्ध COM कक्षाएं हैं जिनमें कोई रैपर नहीं है। पिनवोक के साथ ऑफिस इंटरऑप करना बेहद दर्दनाक होगा।

पिनवोक के साथ एक और मूल समस्या यह है कि आम तौर पर घोषणाओं को लिखने के लिए क्लाइंट प्रोग्रामर का बोझ होता है। व्यक्ति को कम से कम उन्हें पाने की संभावना है। एक COM लेखक एक .NET असेंबली में मेटाडेटा की तरह एक ऑटो-जनरेटेड प्रकार लाइब्रेरी प्रकाशित कर सकता है। गलतियों के लिए बाधाओं को काफी हद तक खत्म करना और परियोजना + संदर्भ से परे क्लाइंट प्रोग्रामर द्वारा आवश्यक कोई काम नहीं।

अपने गोलियों को संबोधित करते:

  • चेक आउट कोड हमेशा पिछले पंजीकृत COM
    का सही dll के बजाय का उपयोग करेगा तुम अब भी विंडोज की अनियमितता उचित DLL खोजने के अधीन हैं। दुर्घटनाओं से बचने का एकमात्र अच्छा तरीका डीएलएल को उसी निर्देशिका में एक्सईई के रूप में स्टोर करना है। कौन सा है, साथ ही कॉम में बहुत संभव है आप सभी नाम yourapp.exe.local

  • एकाधिक संस्करण सर्वर पर कंधे से कंधा मिलाकर चला सकते हैं के साथ एक खाली फ़ाइल बनाने करना है (उदाहरण के लिए: देव, परीक्षण और गुणवत्ता आश्वासन)
    कॉम में नहीं एक समस्या या तो, ऊपर तकनीक का उपयोग कर या एक reg मुक्त प्रकट

  • कोई और अधिक COM पंजीकरण परेशानी
    उपयोग एक reg मुक्त प्रकट तो कोई पंजीकरण की आवश्यकता है का उपयोग करके। करने के लिए बहुत आसान है, बस सही के संदर्भ की पृथक संपत्ति सेट करें।

  • कॉम संचार की तुलना में बहुत तेजी से
    यह बहुत धीमी कॉम से है (लेख मैंने पढ़ा है एक 30% की गति में वृद्धि से संकेत मिलता है)। आप IDISpatch के माध्यम से देर से कॉम कॉल करके अतिरिक्त लागत ले सकते हैं, जो लगभग पिनवोक कॉल के रूप में महंगा है।


वहाँ मूल कोड इंटरॉप करने के लिए एक तीसरा रास्ता है: C++/CLI भाषा में एक कामयाब वर्ग आवरण लेखन। यह तकनीक .NET ढांचे में विशेष रूप से उपयोग की जाती है, खासकर mscorlib.dll, System.Data और PresentationFramework में, असेंबली जिनके मूल कोड पर मजबूत निर्भरता है। हालांकि डेल्फी के लिए बहुत उपयुक्त नहीं है, यह देशी कोड के लिए सबसे अच्छा काम करता है जिसे आसानी से सी या सी ++ से बुलाया जा सकता है।

+0

ग्रेट उत्तर। मैंने एक reg-free manifest की कोशिश की, लेकिन कम से कम दृश्य स्टूडियो (अलग संपत्ति) के भीतर से काम नहीं कर सका। मुझे यकीन नहीं है कि "yourapp.exe.local" सही COM खोजने के व्यवहार को कैसे बदलता है? – Cohen

+0

मुझे नहीं पता कि "यह काम नहीं करता" प्रश्नों का उत्तर कैसे दिया जाए। .local फ़ाइल केवल रजिस्ट्री कुंजी में निर्दिष्ट पथ के बावजूद, EXE युक्त निर्देशिका में देखने के लिए Windows लोडर को बताती है। क्रूड और एक मैनिफेस्ट के लिए कोई विकल्प नहीं है, लेकिन यह निश्चित रूप से आसान हो सकता है। –

+0

"'यह काम नहीं करता है'-प्रश्न।" मै समझता हुँ। मुझे मैनिफेस्ट फाइलों में और देखना होगा। मुझे नहीं लगता कि .local एक asp.net वातावरण में एक समाधान होगा। यदि मैं गलत नहीं हूं, तो इस मामले में बहिष्कार आईआईएस कार्यकर्ता प्रक्रिया होगी? – Cohen

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