2011-09-11 16 views
5

मैं असेंबली की सूची से रनटाइम पर एक प्रकार का पता लगाने की कोशिश कर रहा हूं; मेरा कोड इस तरह कुछ है:टाइप.गेट टाइप() काम और असेंबली.गेटटाइप() क्यों काम नहीं करेगा?

foreach (Assembly assembly in assembliesToSearch) 
{ 
    Type t = assembly.GetType(assemblyName); 
    if (t != null) 
    { 
     return t; 
    } 
} 

, और मेरी समस्या यह है कि टी हमेशा नल के रूप में आ रहा है।

Type.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

ठीक काम करता है, लेकिन

assembly.GetType(typeof(MyNamespace.MyClass).AssemblyQualifiedName) 

नहीं है (विधानसभा है जब: डीबगर और VS2010 में इंटरमीडिएट खिड़की के साथ प्रयोग करना, मैं निम्नलिखित जब मैं पाश के अंदर एक ब्रेकपाइंट डाल देखा असेंबली जो मुझे पता है वह कक्षा है जिसमें मैं ढूंढ रहा हूं - डीबगर में, मैं असेंबली पर एक घड़ी डाल सकता हूं। गेट टाइप(), कक्षा को ब्राउज़ करें जिसे मैं तुरंत चालू करने की कोशिश कर रहा हूं, और असेंबली कॉल करता हूं। गेट टाइप ("MyNamespace.MyClass , माईनेस्पेस "))।

क्या कोई जानता है कि Type.GetType() कामों का उपयोग करके सभी असेंबली क्यों खोज रहे हैं, लेकिन असेंबली को खोजते हुए मुझे पता है कि असेंबली का उपयोग कर प्रकार है। GetType() नहीं है?

उत्तर

9

दो तरीकों के लिए MSDN डॉक्स से, Type.GetType() एक प्रकार का एक विधानसभा से योग्य नाम जबकि Assembly.GetType() प्रकार की पूरा नाम उम्मीद की उम्मीद है। ये वही बात नहीं हैं।

typeof(MyNamespace.MyClass).AssemblyQualifiedName एक प्रकार (MyNamespace.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral की तरह कुछ) की एक सभा से योग्य नाम के मूल्यांकन करता है, तो यह Assembly.GetType() कॉल जो प्रारूप MyNamespace.MyClass में एक स्ट्रिंग की उम्मीद है के साथ काम नहीं करता।

यह शायद इस तथ्य के लिए नीचे है कि जब आप Assembly.GetType() कॉल पर असेंबली-योग्य नाम पास करते हैं, तो वह असेंबली में एक प्रकार की तलाश कर रहा है जिसका पूरा नाम आपके द्वारा प्रदान की गई मेल से मेल खाता है। यह एक नहीं ढूंढ सकता है, इसलिए आपको null लौटा दिया गया है। यह Type.GetType() कॉल के मामले में नहीं है क्योंकि यह एक प्रकार का असेंबली-योग्य नाम प्राप्त करने की अपेक्षा करता है और असेंबली और प्रकार दोनों का पता लगा सकता है।


कुछ नोट करने के लिए:

आप के रूप में आप कहते हैं, आप में प्रत्येक विधानसभा पर Assembly.GetType() कॉल का उपयोग कर बंद शायद बेहतर कर रहे हैं "विधानसभाओं की एक सूची से कार्यावधि में एक प्रकार का पता लगाने की कोशिश कर रहा" रहे हैं, तो सूची के पूर्ण नाम में सूची और गुजरना। Type.GetType() अधिकतर इस प्रकार को हल करने के लिए वर्तमान में असेंबली के संदर्भों का उपयोग करेगा, इसलिए अगर किसी ऐसे असेंबली में टाइप मौजूद है जो संदर्भ नहीं है, तो यह नहीं मिलेगा।

+0

प्रतिक्रिया के लिए धन्यवाद; मेरा प्रारंभिक कोड नमूना इसे स्पष्ट रूप से नहीं दिखाता है, लेकिन मेरे लूप के अंदर जहां मैं कॉल कर रहा हूं टाइप टी = असेंबली। गेट टाइप (असेंबलीनाम), असेंबलीनाम "MyNamespace.MyClass, MyAssembly" है, इसलिए मेरी गणना के अनुसार, इसे वापस करना चाहिए उम्मीद प्रकार। –

+0

@ डेविड: 'MyNamespace.MyClass, MyAssembly' अभी भी एक असेंबली-योग्य प्रकार का नाम है। 'Assembly.GetType()' के साथ काम करने के लिए आपको उस स्ट्रिंग से असेंबली नाम छोड़ना होगा। – adrianbanks

+0

@adrianbanks - आप कहां से सीखते हैं "Type.GetType() इस प्रकार को हल करने के लिए वर्तमान में असेंबली के संदर्भों का उपयोग कर रहे हैं" - ऐसा लगता है कि यह [एमएसडीएन यहाँ] में नहीं है (http: // msdn .microsoft.com/en-us/पुस्तकालय/w3f99sx1 (v = vs.110) .aspx)। इसके अलावा, "वर्तमान असेंबली" क्या है? इस मामले में मैं अब देख रहा हूं, प्रकार के साथ असेंबली - जो पाया जाता है! - वर्तमान में निष्पादित विधि के साथ असेंबली नहीं है और इसका संदर्भ नहीं है ... लेकिन यह कॉल स्टैक पर एक असेंबली _is_ है।(मेरे प्रश्न का कारण: मेरे असेंबली नाम में संस्करण गलत है लेकिन प्रकार पाया जाता है।) – davidbak

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