2012-11-21 71 views
5

我從api文檔中瞭解到ReflectionOnlyGetType返回的類型很像GetType。不同之處在於,使用ReflectionOnlyGetType時,該類型僅用於反射而不用於執行。ReflectionOnlyGetType vs 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加載一個類型,該類型已由運行時加載以供執行。您可以檢查Assembly上的ReflectionOnly屬性以查看它是否已加載到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

不能使用只反射上下文從一個版本比 版本在執行上下文中的其他.NET Framework的加載版本 mscorlib.dll中的。

我猜測,擴展到加載當前執行上下文到只反射的上下文。

這似乎與其他BCL組件的工作:

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

幾乎得到它..這是否意味着當你調用GetType或ReflectionOnlyGetType,它會導致它的類型加上定義的程序集中的所有其他類型,被加載?並取決於你如何加載的類型,將確定如果程序集是隻加載反射?爲什麼Assembly.Load方法中沒有僅反射標誌? – Mishax

+2

@Mishax這些'GetType'方法將導致包含程序集被加載到適當的上下文中。有一些靜態方法僅以反射方式加載程序集:「Assembly.ReflectionOnlyLoad」和「Assembly.ReflectionOnlyLoadFrom」。 –