【问题标题】:Type.GetType() returns nullType.GetType() 返回 null
【发布时间】:2018-11-16 18:31:57
【问题描述】:

这些都返回 null,我希望第一个可以工作:

 Type.GetType("Namespace.To.My.Type, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
 Type.GetType("Namespace.To.My.Type, MyAssembly")
 Type.GetType("Namespace.To.My.Type")

所以,在调试时,我尝试了这个:

var aqn = AppDomain.CurrentDomain.GetAssemblies()[92].GetType("Namespace.To.My.Type").AssemblyQualifiedName; // Namespace.To.My.Type, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Type.GetType(aqn)

(其中92MyAssembly

它也返回 null。

发生了什么?我的程序集只是半载还是什么?当然不是,因为我可以这样做:

AppDomain.CurrentDomain.GetAssemblies()[92].GetTypes()[161]

找到Namespace.To.My.Type,还有

AppDomain.CurrentDomain.GetAssemblies()[92].GetType("Namespace.To.My.Type")

更新

  • 值得注意的是,MyAssembly 已在上述代码之前通过 Assembly.Load(path) 加载
  • 我在控制台应用中
  • 我的类型的 AQN 显示在上面的代码注释中,向右滚动
  • 如果我让GetType 抛出,它会抛出:“无法加载文件或程序集 'MyAssembly' 或其依赖项之一。系统找不到指定的文件。”

Fuslogvw 输出:

FusionLog: "=== 预绑定状态信息 ===\r\nLOG: DisplayName = Namespace.To.My.Type, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null\n (完全指定)\r\nLOG:Appbase = file:///MyConsoleAppPath/bin/Debug/\r\nLOG:初始 PrivatePath = NULL\r\n调用程序集:MyConsoleApp,Version=0.0.0.0,Culture=neutral,PublicKeyToken =null。\r\n===\r\nLOG:此绑定在默认加载上下文中启动。\r\nLOG:使用应用程序配置文件:D:\MyConsoleAppPath\bin\Debug\MyConsoleApp.exe.Config\r\ nLOG: 使用主机配置文件:\r\nLOG: 使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 中的机器配置文件。\r\nLOG: 策略未应用于参考这次(私有、自定义、部分或基于位置的程序集绑定)。\r\n

【问题讨论】:

  • 您可以使用重载Type.GetType(string, bool),并将 bool 设置为 true。如果发生可能包含更多信息的错误,这将强制异常。
  • 使用调试器查看 AppDomain.CurrentDomain.GetAssemblies()[92].GetTypes()[161] 的返回值可以获得什么完全限定名称?
  • 一个明显的场景是这个 DLL 最初是以非标准方式加载的。 AppDomain.LoadFile() 和 AppDomain.Load(byte[]) 作为一种非常邪恶的方法特别值得注意。使用 Fuslogvw.exe 取得成功。
  • “之前看到过相同的绑定,但失败了” - 重新启动您的应用程序。
  • @HansPassant 是的,我正在这样做,解决方案是什么?

标签: c#


【解决方案1】:

这是答案:Is it possible to use Type.GetType with a dynamically loaded assembly?

因为我已经通过 Assembly.Load 加载了程序集 - 虽然我仍然不明白为什么这会导致观察到的问题

【讨论】:

  • 您可以尝试使用LoadFrom 代替Load 吗? (LoadFrom 实际上也会加载依赖项等)。另外,为什么不能使用dynamicAssembly.GetType 而不是Type.GetType?阅读您的帖子,您似乎参考了dynamicAssembly..
【解决方案2】:

我已经遇到过这个问题。程序集的框架和项目的框架不对应,可能是你的情况。

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 2012-02-01
    • 2011-11-18
    • 2011-11-09
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多