c# विजुअल स्टूडियो 2010 एक्सप्रेस में स्वचालित रूप से सी#रैपर क्लास को डीएल से उत्पन्न करें?




dll wrapper (3)

यह निश्चित रूप से किसी भी डीएलएल के साथ संभव नहीं है। बस एक बहुत ही विशिष्ट प्रकार, जो एक COM सर्वर लागू करता है। कनवर्टर को निर्यात प्रकारों का एक अच्छा विवरण चाहिए, जो किसी प्रकार के पुस्तकालय द्वारा ऐसे सर्वरों के लिए प्रदान किया जाता है।

एक प्रकार की लाइब्रेरी एक प्रबंधित असेंबली में मेटाडेटा के बराबर बराबर है। हालांकि यह एक स्टैंडअलोन फ़ाइल के रूप में जीवन शुरू करता है, एक .tlb फ़ाइल, यह अक्सर डीएलएल में संसाधन के रूप में एम्बेडेड हो जाता है। इसके लिए अच्छी जगह, उस प्रकार के कोड के करीब टाइप विवरण रखती है जो इसे लागू करती है। एक .NET असेंबली में मेटाडेटा की तरह।

कुछ प्रकार के पुस्तकालयों को देखने के लिए खेलने के लिए टूलिंग (सुनिश्चित नहीं है कि यह एक्सप्रेस में काम करता है): विजुअल स्टूडियो में फ़ाइल + ओपन + फ़ाइल का उपयोग करें और कहें, c: \ windows \ system32 \ shell32.dll। आप उस डीएलएल में संसाधन देखेंगे, TYPELIB नोड नोट करें। वह प्रकार पुस्तकालय है। यह बाइनरी है इसलिए वास्तव में इसे पढ़ना व्यावहारिक नहीं है। इसके लिए, विजुअल स्टूडियो कमांड प्रॉम्प्ट से OleView.exe चलाएं। फ़ाइल + टाइप टाइप करें और एक ही डीएलएल का चयन करें। वह टाइप लाइब्रेरी को आईडीएल में वापस ले जाता है, इंटरफ़ेस विवरण भाषा जिसका मूल रूप से टाइप लाइब्रेरी बनाने के लिए उपयोग किया जाता था। अत्यधिक पठनीय, आपको भाषा को समझने में थोड़ी परेशानी होगी। और आसानी से देख सकता है कि .NET Tlbimp.exe उस प्रकार की लाइब्रेरी को समकक्ष सी # घोषणाओं में कैसे अनुवाद कर सकता है।

प्रकार पुस्तकालय पुराने हैं, वे 1 99 6 से आसपास रहे हैं। मूल रूप से माइक्रोसॉफ्ट में विजुअल बेसिक टीम द्वारा डिजाइन किया गया, वीबीएक्स के प्रतिस्थापन के रूप में, 16-बिट वीबी विस्तारशीलता मॉडल। वे बहुत सफल रहे हैं, व्यावहारिक रूप से कोई भी विंडोज कंपाइलर उनका समर्थन करता है। लेकिन वे अभिव्यक्तिशील शक्ति में सीमित हैं, जेनेरिक और कार्यान्वयन विरासत जैसी चीजों के लिए कोई समर्थन नहीं है। उल्लेखनीय है कि विंडोज 8 टीम ने WinRT के लिए टाइप लाइब्रेरी को बदल दिया है। उन्होंने .NET मेटाडेटा प्रारूप चुना।

मुझे अपने एक सहयोगी ने बताया कि विजुअल स्टूडियो एक को .dll को इंगित करने की अनुमति देता है और ऑटो-जादुई रूप से सी # रैपर वर्ग उत्पन्न करता है। क्या यह वास्तव में संभव है? और यदि हां, तो यह कैसे प्राप्त करने के बारे में जाता है? मैंने वेब ब्राउज़ किया है, लेकिन कुछ भी आने में असफल रहा है!

सबको शुक्रीया!

अनुमान लगाया कि मैं इन संसाधनों को भी साझा करूंगा,


3 मामले:

  1. डीएलएल एक प्रबंधित असेंबली का प्रतिनिधित्व करता है => आप इसे सीधे अपने प्रोजेक्ट में संदर्भित करते हैं और इसका उपयोग करते हैं
  2. डीएलएल एक COM ऑब्जेक्ट का प्रतिनिधित्व करता है => आप एक प्रबंधित रैपर उत्पन्न करने के लिए tlbimp.exe उपयोगिता का उपयोग कर सकते हैं
  3. डीएलएल कुछ निर्यातित कार्यों के साथ एक अप्रबंधित पुस्तकालय का प्रतिनिधित्व करता है। यह सबसे कठिन है। कोई उपकरण नहीं हैं आपको निर्यात किए गए फ़ंक्शन नामों और पैरामीटरों को जानने और प्रबंधित पी / आमंत्रण रैपर बनाने के लिए लाइब्रेरी के दस्तावेज़ों से परामर्श करना होगा। निर्यात किए गए कार्यों की सूची देखने के लिए आप dumpbin.exe उपयोगिता का उपयोग कर सकते हैं। विभिन्न चरणों के बारे में एमएसडीएन पर एक लेख यहां दिया गया है।

मुझे पता है कि यह सवाल काफी पुराना है और ऐसा लगता है कि पर्याप्त उत्तर दिया गया है, लेकिन मैं सिर्फ एक विचार जोड़ना चाहता हूं जो मुझे लगता है कि यह महत्वपूर्ण हो सकता है। मैं पूरी तरह से गलत हो सकता था, इसलिए कृपया मेरा जवाब नमक के अनाज के साथ लें और अगर मैं हूं तो मुझे सही करें।

डीएलएल में सदस्यों / फ़ील्ड को कॉल करने में सक्षम होने के लिए, उन्हें कॉल करने के लिए आवश्यक जानकारी कुछ रूपों में पहुंच योग्य होनी चाहिए। वह जानकारी आपको एक रैपर लिखने की आवश्यकता होनी चाहिए। इसके साथ, आप सभी सदस्यों / फ़ील्ड "फॉर्म" उर्फ ​​विधि हेडर आदि को निर्धारित कर सकते हैं।

सी # में प्रतिबिंब के माध्यम से डीएलएल लोड करना संभव है और वह जानकारी प्राप्त करें। मैं ऊपर वर्णित विभिन्न डीएलएल-प्रकारों के बारे में नहीं जानता, लेकिन जैसा कि मैंने कहा, सदस्यों / क्षेत्रों को कॉल करने के लिए यह जानकारी कुछ रूप में होनी चाहिए। तो उस जानकारी को प्राप्त करने के लिए प्रतिबिंब का उपयोग करके, आप एक नई कक्षा जैसे "उपसर्ग ऑरिगिनलनाम" उत्पन्न कर सकते हैं और इसमें आपके मूल वर्ग के समान सदस्य / फ़ील्ड हैं, जो आपके मूल वर्ग के सदस्यों / फ़ील्ड को कॉल कर रहे हैं और अपनी वांछित अतिरिक्त कार्यक्षमता जोड़ रहे हैं।

इसलिए

  1. प्रत्येक डीएलएल (या परिधीय दस्तावेज़) आपको जानकारी को अपने प्रकारों का उपयोग करने की आवश्यकता देता है। अर्थात् सब कुछ जो "सार्वजनिक" के रूप में लागू किया जाता है
  2. आप प्रतिबिंब के माध्यम से इस आवश्यक जानकारी तक पहुंच सकते हैं
  3. दिया गया 1. और 2., आप डीएलएल से आवश्यक जानकारी निकालने के लिए एक प्रोग्राम बना सकते हैं और तदनुसार रैपर उत्पन्न कर सकते हैं।

जैसा कि मैंने कहा, मैं इस पर 100% निश्चित नहीं हूं, क्योंकि अन्य उत्तर मुझे यह ध्वनि देते हैं जैसे किसी कारण से यह बहुत कठिन या असंभव हो सकता है।





visual-studio-express