Assembly.GetType()和typeof()返回不同的类型?

时间:2009-10-06 21:50:39

标签: c# reflection types

假设您获得了一个由以下简单代码编译的Class.dll程序集:

namespace ClassLibrary
{
    public class Class
    {
    }
}

考虑使用上述Class.dll作为项目引用的不同项目,并使用以下代码:

Assembly assembly = Assembly.LoadFrom(@"Class.dll");

Type reflectedType = assembly.GetType("ClassLibrary.Class");
Type knownType = typeof(ClassLibrary.Class);

Debug.Assert(reflectedType == knownType);

断言失败了,我不明白为什么。

如果用例如System.Text.RegularExpressions.Regex类和带有System.dll的Class.dll替换ClassLibrary.Class,断言会成功,所以我猜它与项目属性有关吗?一些编译开关也许?

提前致谢

3 个答案:

答案 0 :(得分:8)

问题是加载上下文:通过.LoadFrom加载的程序集保存在与Fusion(.Load)加载的程序集不同的“堆”中。这些类型实际上与CLR不同。检查this link以获取CLR架构师的更多详细信息。

答案 1 :(得分:2)

您可能正在加载同一个程序集的两个不同副本。

在调试器中将knownType.AssemblyreflectedType.Assembly进行比较,然后查看路径和版本。

答案 2 :(得分:2)

我认为您没有引用从磁盘加载的相同程序集。

此示例(编译为Test.exe时)工作正常:

using System;
using System.Reflection;

class Example
{
    static void Main()
    {
        Assembly assembly = Assembly.LoadFrom(@"Test.exe");

        Type reflectedType = assembly.GetType("Example");
        Type knownType = typeof(Example);

        Console.WriteLine(reflectedType == knownType);
    }
}