2012-11-21 12 views
5

मैं एपीआई दस्तावेज से समझता हूं कि ReflectionOnlyGetType एक प्रकार देता है, जो GetType की तरह है। अंतर यह है कि ReflectionOnlyGetType के साथ, प्रकार केवल प्रतिबिंब के लिए लोड किया जाता है, निष्पादन के लिए नहीं।ReflectionOnlyGetType बनाम GetType

तो क्यों काम करता है:

Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false); 
    ConstructorInfo[] cis = t.GetConstructors(); 
    foreach (ConstructorInfo ci in cis) 
    { 
     if (ci.GetParameters().Length == 0) 
     { 
      // ! no arg constructor found! let's call it! 
      Object o = ci.Invoke(new Object[]{}); 
      Console.WriteLine("But wait, it was supposed to be reflection only??"); 
      Console.WriteLine(o.GetType().Name); 
      List<String> lli = (List<String>)o; 
      lli.Add("but how can this be?"); 
      Console.WriteLine(lli.Count); 
      Console.WriteLine("I am doing a lot more than reflection here!"); 
     } 
    } 

मेरे सवाल यह है: मैं एक से अधिक इस प्रकार के सदस्यों पर प्रतिबिंबित करने के लिए सक्षम होने लगते हैं। क्या मैंने "निष्पादन" को गलत समझा है जब वे कहते हैं कि "केवल प्रतिबिंब के लिए, निष्पादन के लिए नहीं" प्रकार लोड किया गया है? या ReflectionOnlyGetType एक अलग (गैर-प्रतिबिंब-केवल) प्रकार लौटा रहा है यदि प्रकार पहले से ही "लोड" था और यहां mscorlib में होने के कारण लोड किया गया था? या यह पूरी तरह से कुछ अलग है?

+0

'mscorlib' पहले से ही क्रम से निष्पादन के लिए लोड किया गया है। –

+1

यदि आप ऐसा कुछ चाहते हैं जो * गारंटीकृत * प्रतिबिंबित हो, केवल IKVM.Reflection.dll आसान हो सकता है; यह मूल रूप से एक पूरी तरह से अलग लोडर/पार्सर है। –

उत्तर

3

आप mscorlib से एक प्रकार लोड कर रहे हैं जो रनटाइम द्वारा निष्पादन के लिए पहले ही लोड हो चुका है। आप एक असेंबली पर ReflectionOnly संपत्ति की जांच कर सकते हैं यह देखने के लिए कि क्या इसे प्रतिबिंब में लोड किया गया है केवल संदर्भ। आपके नमूने में,

Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false); 
Console.WriteLine(t.Assembly.ReflectionOnly); // prints False. 

ऐसा लगता है कि mscorlib पर प्रतिबिंबित कुछ हद तक प्रतिबंधित है। MSDN से:

आप नेट निष्पादन संदर्भ में संस्करण की तुलना में अन्य फ्रेमवर्क के एक संस्करण से mscorlib.dll का एक संस्करण लोड करने के लिए प्रतिबिंब-केवल संदर्भ का उपयोग नहीं कर सकते हैं।

मुझे लगता है कि वर्तमान निष्पादन संदर्भ में प्रतिबिंबित केवल संदर्भ में लोड करने के लिए विस्तारित है।

यह अन्य बीसीएल विधानसभाओं के साथ काम करने लगता है:

Console.WriteLine(Assembly.ReflectionOnlyLoad("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089").ReflectionOnly); // prints True 
बेशक
+0

लगभग इसे प्राप्त हुआ .. क्या इसका मतलब यह है कि जब आप GetType या ReflectionOnlyGetType का आह्वान करते हैं, तो इसका लोड होने के लिए इसके प्रकार के प्लस अन्य सभी प्रकारों को परिभाषित असेंबली में होता है? और इस बात के आधार पर कि आपने किस प्रकार को लोड किया है, यह निर्धारित करेगा कि असेंबली केवल प्रतिबिंब लोड है या नहीं? असेंबली में कोई प्रतिबिंब-केवल ध्वज क्यों नहीं है। लोड विधियां? – Mishax

+2

@ मिशैक्स उन 'गेट टाइप' विधियों में असेंबली को उचित संदर्भ में लोड किया जाएगा। एक असेंबली को केवल प्रतिबिंब के रूप में लोड करने के लिए स्थिर तरीके हैं: 'असेंबली। रिफ्लेक्शनऑनलीलोड' और 'असेंबली। रिफ्लेक्शनऑनलीलोड' से। –

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