2011-09-26 28 views
23

संस्करण 3.0 के बाद, .NET विभिन्न प्रोफाइल का समर्थन करने के लिए सी: \ प्रोग्राम फ़ाइलें \ संदर्भ असेंबली \ माइक्रोसॉफ्ट .... के तहत विभिन्न 'संदर्भ असेंबली' का एक गुच्छा स्थापित करता है (.NET 3.5 क्लाइंट प्रोफाइल, सिल्वरलाइट प्रोफ़ाइल कहें)। इनमें से प्रत्येक एक उचित .NET असेंबली है जिसमें केवल मेटाडाटा - कोई आईएल कोड नहीं है - और प्रत्येक असेंबली को ReferenceAssemblyAttribute के साथ चिह्नित किया गया है। मेटाडेटा लागू प्रकार के तहत उपलब्ध उन प्रकारों और सदस्य तक सीमित है - इस प्रकार इंटेलिजेंस प्रकारों और सदस्यों के प्रतिबंधित सेट को दिखाता है। रेफरटाइम पर संदर्भ असेंबली का उपयोग नहीं किया जाता है।मैं .NET मेटाडाटा-केवल 'संदर्भ असेंबली' कैसे बना सकता हूं और उपयोग कर सकता हूं?

मैंने this blog post से इसके बारे में कुछ सीखा।

मैं अपनी लाइब्रेरी के लिए ऐसी संदर्भ असेंबली बनाना और उपयोग करना चाहता हूं।

  1. मैं मेटाडेटा-केवल असेंबली कैसे बना सकता हूं - क्या कुछ कंपाइलर ध्वज या ildasm पोस्ट प्रोसेसर है?
  2. क्या ऐसे गुण हैं जो नियंत्रित करते हैं कि किस प्रकार को विभिन्न 'प्रोफाइल' में निर्यात किया जाता है?
  3. रनटाइम पर संदर्भ असेंबली रिज़ॉल्यूशन कैसे करता है - अगर मेरे पास 'असली' असेंबली की बजाय मेरी एप्लिकेशन निर्देशिका में संदर्भ असेंबली मौजूद है, और जीएसी में नहीं, तो जारी रखने की जांच होगी और मेरी असेंबली रीसोल्व इवेंट आग होगी ताकि मैं रनटाइम पर वास्तविक असेंबली की आपूर्ति कर सकते हैं?

कोई विचार या पॉइंटर्स जहां मैं इसके बारे में अधिक जान सकता हूं, की सराहना की जाएगी।

अद्यतन: थोड़ा चारों ओर देखते हुए, मैं देख रहा हूँ .NET 3.0 'संदर्भ विधानसभाओं' कुछ कोड है लगता है, और Reference Assembly attribute केवल .NET 4.0 में जोड़ा गया है। तो नए रनटाइम के साथ व्यवहार थोड़ा बदल गया होगा।

क्यों? मेरे एक्सेल-डीएनए (http://exceldna.codeplex.com) ऐड-इन लाइब्रेरी के लिए, मैं संदर्भित असेंबली को संसाधनों के रूप में .xll फ़ाइल में पैक करके एकल-फ़ाइल .xll ऐड-इन बना देता हूं। पैक किए गए असेंबली में उपयोगकर्ता के एड-इन कोड, साथ ही एक्सेल-डीएनए प्रबंधित लाइब्रेरी (जिसे उपयोगकर्ता की असेंबली द्वारा संदर्भित किया जा सकता है) शामिल हैं।

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

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

+1

क्यों आप ऐसा करना चाहते हैं? – svick

उत्तर

9

एक संदर्भ विधानसभा बनाने के लिए, आप अपने AssemblyInfo.cs फाइल करने के लिए इस लाइन जोड़ना होगा:

[assembly: ReferenceAssembly] 

दूसरों लोड करने के लिए, आप उन्हें हमेशा की तरह अपने VisualStudio परियोजना संदर्भों से संदर्भित कर सकते हैं, या गतिशील कार्यावधि में उपयोग करते हुए:

Assembly.ReflectionOnlyLoad()

या

Assembly.ReflectionOnlyLoadFrom()


आप, तो IntelliSense और अपनी परियोजना के निर्माण के ठीक से काम करेंगे, लेकिन यदि आप एक के खिलाफ अपने आवेदन निष्पादित करने के लिए प्रयास करते हैं, तो आपको एक त्रुटि मिल जाएगा विधानसभा VisualStudio का उपयोग कर एक मेटाडाटा/संदर्भ के लिए एक संदर्भ जोड़ा है, तो:

System.BadImageFormatException: Cannot load a reference assembly for execution.

तो उम्मीद है कि कार्यावधि में आप एक असली विधानसभा ही मेटाडाटा हस्ताक्षर है कि में स्थानापन्न होता है।

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


मैं उत्सुक हूं कि आपका उपयोग केस मेटाडाटा-केवल असेंबली बनाने के लिए क्या है। मुझे पहले कभी ऐसा नहीं करना पड़ा था, और आपको यह जानना अच्छा लगेगा कि क्या आपको उनके लिए कुछ दिलचस्प उपयोग मिला है ...

+2

एक ** प्रत्याशित उदाहरण ** बना रहा है: आप एक .NET असेंबली की मूल छवि बना सकते हैं उदा। मोनो mkbundle.exe। अब आप मूल असेंबली के सार्वजनिक इंटरफ़ेस तक पहुंचने के लिए प्लगइन डीएलएस को अनुमति देना चाहेंगे। मुझे यकीन है कि आप इसे इस तरह से काम कर सकते हैं। यदि कुछ भी हो तो इसका परिणाम _really_ obfuscated और _large_ assemblies :) – sehe

+0

संदर्भ जोड़ना विशेषताएँ विशेषता आउटपुट को मेटाडेटा-केवल असेंबली में परिवर्तित नहीं करती है जैसे .NET 4 संदर्भ असेंबली। मैं यह पता लगाने की कोशिश कर रहा हूं कि ये कैसे बनाए गए हैं। मुझे कोशिश करनी होगी, लेकिन BadImageFormatException को संभालने के बाद, क्या आपको लगता है कि असेंबली रिज़ॉल्यूशन मेरे असेंबली रिजोल्यू हैंडलर को कॉल करेगा? (मैं प्रश्न के लिए अपने उपयोग के मामले का विवरण जोड़ूंगा।) – Govert

+0

मैंने कुछ जानकारी जोड़ दी है कि मुझे रूचि क्यों है। @sehe निशान से बहुत दूर नहीं है! पैक किए गए असेंबली वास्तव में छोटे होते हैं, क्योंकि मैं पैकिंग से पहले उन्हें संपीड़ित करता हूं, और सीएलआई असेंबली बहुत अच्छी तरह से संपीड़ित होती है। नतीजा केवल 'अस्पष्टता' अर्थ में खराब हो गया है - .NET असेंबली आपके चेहरे में नहीं हैं, इसलिए आपको ILSpy पर इंगित करने से पहले थोड़ा सा काम करना होगा। लेकिन उस तरह का एक obfuscator एक और अच्छा उपयोग मामला होगा। – Govert

2

हां, यह .NET 4.0 के लिए नया है। मुझे यकीन है कि यह .NET 2.0 सर्विस पैक में ग़लत संस्करण समस्याओं से बचने के लिए किया गया था। सबसे अच्छा उदाहरण है WaitHandle.WaitOne (int) अधिभार, एसपी 2 में जोड़ा और दस्तावेज। एक लोकप्रिय अधिभार क्योंकि यह WaitOne (int, bool) अधिभार में * exitContext "के उचित मूल्य पर अनुमान लगाने से बचाता है। समस्या यह है कि प्रोग्राम 2.0 पर चलता है जब यह 2.0 के संस्करण पर चलाया जाता है जो SP2 से पुराना है। या तो निदान। संदर्भ विधानसभाओं अलग करता है। कि यह फिर से ऐसा नहीं हो सकता

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

+0

आह! मुझे लगता है कि यह वह उपकरण है जिसे मैं ढूंढ रहा हूं ... – Govert

+1

हंस, मुझे विश्वास है कि वह टूल वास्तव में आपके विचार से अधिक बार उपयोग किया जाता है। मेटा-डेटा केवल असेंबली को कोर नेट फ्रेमवर्क असेंबली बूटस्ट्रैपिंग का भी उपयोग किया जाता है, जैसा कि [इस उत्तर] (http://stackoverflow.com/questions/1316518/z/1316587) में बताया गया है कि वे नेट को कैसे संकलित करते हैं। फ्रेमवर्क असेंबली। बेशक, उन विधानसभाओं के लिए विशेष औजारों के माध्यम से किए गए अन्य परिवर्तन भी हैं, जैसे 'm_value' सदस्य के संदर्भ वाले प्राइमेटिवेटिव प्रकारों को 'इस' के संदर्भ में प्रतिस्थापित किया गया है। –

+0

धन्यवाद केविन अन्य प्रश्न के लिए सूचक के लिए धन्यवाद। तो उन संदर्भ असेंबली 'निर्जलित' मेटाडेटा-केवल असेंबली हैं। – Govert

1

आपको सेसिल लाइब्रेरी (मोनो से) के साथ भाग्य हो सकता है; मुझे लगता है कि कार्यान्वयन ILMerge कार्यक्षमता की अनुमति देता है, यह केवल मेटाडेटा केवल असेंबली लिख सकता है।

मैं (प्रलेखन विरल है) कोड बेस स्कैन किया है, लेकिन किसी भी स्पष्ट सुराग नहीं मिला है अभी तक ...

YYMV

3

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

https://github.com/KarimLUCCIN/il-repack/tree/xna

(मैं इसे पूर्ण XNA फ्रेमवर्क पर की कोशिश की और उसके afaik काम कर रहे ...)

+0

धन्यवाद (यहां वापस पोस्ट करने के लिए भी)! अभी भी दिलचस्पी है - मुझे एक मौका मिलेगा जब मुझे मौका मिलेगा। – Govert

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

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