8

मुझे असेंबली के बारे में कुछ मेटा-डेटा प्राप्त करने की आवश्यकता है जो मेरे घटक को कॉल करता है। इस प्रकार, Assembly.GetCallingAssembly() का उपयोग करना एक प्राकृतिक फिट प्रतीत होता है। हालांकि, मैंने पाया है कि यह विंडोज स्टोर में छोड़कर हर जगह काम करता है। कहाँ यह समर्थित है:असेंबली। GetCallingAssembly WinRT पर समर्थित नहीं है, लेकिन पोर्टेबल क्लास पुस्तकालयों के लिए है?

हालांकि, जहां यह समर्थित नहीं है एक Windows स्टोर आवेदन के भीतर सीधे है। मैं एक पोर्टेबल क्लास लाइब्रेरी बना सकता हूं और फिर इसे विंडोज स्टोर एप्लिकेशन के अंदर से कॉल कर सकता हूं, लेकिन मैं इसे सीधे विंडोज स्टोर एप/क्लास लाइब्रेरी में नहीं डाल सकता।

क्या Assembly द्वारा प्रदान किए गए मेटाडेटा के प्रकार को प्राप्त करने के लिए इस या किसी अन्य तरीके से कोई कामकाज है?

उत्तर

7

Assembly.GetCallingAssembly WinRT में सामने आ रहा है नहीं - माना जाता है कि क्योंकि इसके अर्थ विज्ञान आदि को इनलाइन (source) का सामना करने में अविश्वसनीय हैं, लेकिन यह भी विंडोज स्टोर ऐप्लिकेशन में अनुमति दी प्रतिबंधित प्रतिबिंब के साथ बहुत अधिक फिट नहीं करता है। आप Assembly.GetCurrentAssembly() की तरह कुछ है, इस तरह जैसे प्राप्त कर सकते हैं:

typeof(MainPage).GetTypeInfo().Assembly 

लेकिन उस पर सभी एक ही नहीं है। प्रतिबंधित प्रतिबिंब मॉडल के साथ, .NET में जितना संभव हो सके रनटाइम पर एक स्टैक ट्रेस प्राप्त करना संभव नहीं होगा।

पोर्टेबल क्लास लाइब्रेरी के रूप में, मैं कहने वाला था कि Assembly.GetCurrentAssembly() सामान्य रूप से पोर्टेबल क्लास लाइब्रेरीज़ में समर्थित है, लेकिन केवल WinRT में नहीं - जो समझ में आता है कि यह उस प्लेटफ़ॉर्म में नहीं है। लेकिन वास्तव में, ऐसा लगता है कि यह WinRT + .NET4.5 को छोड़कर WinRT समेत सभी प्रोफाइल में मौजूद है - ऐसा लगता है कि इस असंगतता के साथ यहां कुछ प्रकार की निगरानी होनी चाहिए। तो विधि WinRT में मौजूद है (और इसके अलावा कोई भी प्रकार की पुनर्निर्देशन चालू नहीं है), लेकिन संकलन समय पर उपलब्ध मेटाडेटा में दिखाई नहीं दे रहा है।

इसलिए आप प्रतिबिंब के साथ विधि कॉल कर सकते हैं:

var assembly = (Assembly) typeof(Assembly).GetTypeInfo() 
    .GetDeclaredMethod("GetCallingAssembly") 
    .Invoke(null, new object[0]); 

मैं Windows स्टोर ऐप्लिकेशन में इस विधि के गैर दृश्यता अनुमान एक "हम चाहते हैं यह दूर जाना होगा" है।

(यह उत्तर केवल "मैं कर सकता हूं" नहीं "मुझे चाहिए")।

2

विधि को केवल इसलिए कटौती की गई क्योंकि यह WinRT ऐप में अविश्वसनीय है। WinRT के लिए एक मजबूत डिज़ाइन लक्ष्य अलग-अलग भाषा रनटाइम वातावरण सरल और परेशानी रहित के बीच इंटरऑप बनाना था। जो अच्छी तरह से काम करता है, आप आसानी से सी # जैसे किसी भाषा में एक WinRT घटक बना सकते हैं और इसे एक ऐप द्वारा उपयोग किया गया है जो एक अप्रबंधित भाषा जैसे सी ++ या जावास्क्रिप्ट में लिखा गया था।

यह डेस्कटॉप डेस्कटॉप .NET ऐप में भी संभव है लेकिन यह एक अधिक जटिल है, इसे [कॉमविज़िबल] असेंबली में वापस गिरना या सी ++/सीएलआई भाषा में मिश्रित-मोड असेंबली बनाना। इस तरह के मामले में असेंबली.गेटकॉलिंगएस्परब्स() का उपयोग करना भी असफल हो जाएगा, हालांकि यह पूरी तरह से प्रोग्रामर द्वारा असफल होने की उम्मीद है क्योंकि वह कुछ विशेष करने के बारे में अच्छी तरह से जानता है।

यह एक WinRT घटक में बहुत अधिक गड़बड़ हो जाता है। खासकर जब यह आवश्यक नहीं होता है तो कॉल वास्तव में किसी अन्य .NET असेंबली से बनाया गया था।लेकिन जब यह अप्रबंधित कोड से आया तो कोई उम्मीद नहीं थी।

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