【问题标题】:Assembly.GetType() and typeof() return different types?Assembly.GetType() 和 typeof() 返回不同的类型?
【发布时间】:2009-10-07 05:54:25
【问题描述】:

假设给定一个由以下简单代码编译的 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);

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

如果我将 ClassLibrary.Class 替换为 System.Text.RegularExpressions.Regex 类并将 Class.dll 替换为 System.dll,则断言成功,所以我猜它与项目属性有关?也许是一些编译开关?

提前致谢

【问题讨论】:

    标签: c# reflection types


    【解决方案1】:

    问题在于加载上下文:通过 .LoadFrom 加载的程序集与通过 Fusion (.Load) 加载的程序集保存在不同的“堆”中。这些类型实际上与 CLR 不同。请查看this link,了解 CLR 架构师提供的更多详细信息。

    【讨论】:

    • 你成功了 - 使用 Assembly.Load() 解决了这个问题。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我想你没有引用你从磁盘加载的同一个程序集。

      这个例子(当编译为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);
          }
      }
      

      【讨论】:

      • 它是一个 asp.net mvc 应用程序,没有对其他类库的外部引用。
      猜你喜欢
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      相关资源
      最近更新 更多