【发布时间】: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)
(其中92 是MyAssembly)
它也返回 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#