5

我从 api 文档中了解到 ReflectionOnlyGetType 返回一个类型,很像 GetType。不同之处在于,使用 ReflectionOnlyGetType,加载类型仅用于反射,而不是用于执行。

那么为什么会这样:

    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!");
        }
    }

我的问题是:我似乎能够做的不仅仅是反思这种类型的成员。当他们说加载类型“仅用于反射,不用于执行”时,我是否误解了“执行”?或者,如果类型已经“加载”并且这里是由于在 mscorlib 中而加载的,那么 ReflectionOnlyGetType 是否会返回不同的(非仅反射)类型?还是完全不同的东西?

4

1 回答 1

3

您正在加载一个类型,mscorlib该类型已经被加载以供运行时执行。您可以检查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
于 2012-11-21T08:32:24.483 回答