代码之家  ›  专栏  ›  技术社区  ›  Ohad Schneider

assembly.getType()和typeof()返回不同的类型?

  •  3
  • Ohad Schneider  · 技术社区  · 15 年前

    假设您得到了一个用以下简单代码编译的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类替换classlibrary.class,或者用system.dll替换class.dll,那么断言会成功,所以我猜想它与项目属性有关?也许是编译开关?

    提前谢谢

    3 回复  |  直到 15 年前
        1
  •  8
  •   nitzmahone    15 年前

    问题在于加载上下文:通过.loadfrom加载的程序集与通过fusion(.load)加载的程序集保存在不同的“堆”中。这些类型实际上与CLR不同。检查 this link 有关CLR架构师的更多详细信息。

        2
  •  2
  •   SLaks    15 年前

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

    比较 knownType.Assembly reflectedType.Assembly 在调试器中,查看路径和版本。

        3
  •  2
  •   Andrew Hare    15 年前

    我可以想象,您所引用的程序集与从磁盘加载的程序集不同。

    此示例(编译为 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);
        }
    }