【问题标题】:Type.GetType fails to create type from already loaded assemblyType.GetType 无法从已加载的程序集中创建类型
【发布时间】:2010-10-24 17:18:08
【问题描述】:

我有使用Asssembly.LoadFrom 方法加载程序集的程序。一段时间后,我尝试使用Type.GetType 从该程序集中创建一个类型(使用AssemblyQualifiedName),但该方法返回null。如果我将它设置为抛出异常,它会告诉

无法加载文件或程序集“...” 或其依赖项之一。系统 找不到指定的文件。

但我确信已经加载了完全相同的程序集(它显示在 AppDomain.CurrentDomain.GetAssemblies() 列表中)。

有人知道可能出了什么问题和/或如何解决这个问题吗?

【问题讨论】:

  • 从该程序集中的代码调用创建类型的方法。 AFAIK,除非正确加载,否则程序集无法执行任何代码。

标签: c# .net reflection assemblies


【解决方案1】:

为了理解为什么这不起作用,您需要了解“加载上下文”的问题。 Type.GetType 只查看“加载”上下文。您加载到内存中的程序集位于“LoadFrom”上下文中。

真正获得加载上下文中的绑定以查看加载源上下文中的程序集的唯一方法是使用 AssemblyResolve 事件并编写代码以返回正确的程序集。 AssemblyResolve 事件在绑定失败并且所有其他程序集查找未成功之前触发。

有关加载上下文和使用 LoadFrom 时出现的问题的更多信息,请参阅以下链接。

MSDN - http://msdn.microsoft.com/en-us/library/dd153782.aspx
AssemblyResolve - http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
苏珊娜库克 - Link

【讨论】:

  • 尝试使用 Assembly.Load(AssemblyName.GetAssemblyName(file))。程序集加载正常(程序的其余部分似乎工作),但 Type.GetType 中的异常保持不变。
  • 现在它可以工作了(在我将程序集所在的目录添加到 app.config 之后)。感谢您对 .NET 领域的解释,我对此一无所知。
  • 对,GetAssemblyName 返回的 AssemblyName 将为您提供程序集的强名称,但是当它传递给 Assembly.Load 时,将遵循正常的程序集探测规则。因此,正如您所指出的,它仅在运行时可以找到可能涉及 app.config 探测提示的程序集时才有效。
【解决方案2】:

如果您可以使用 Assembly.LoadFrom 获取程序集,那么您可以通过以下方式获取类型:

        Assembly assembly = Assembly.LoadFrom("whatever");
        Type myType = assembly.GetType("typeName")

assembly.GetType 有其他重载,您可以了解有关 here 的其他重载

【讨论】:

  • +1 不错的实用解决方案。如果其他代码尝试在没有 AssemblyResolve 的情况下通过加载上下文在同一程序集中加载其他类型,他仍然可能会遇到问题。不幸的是,LoadFrom 只是有一些难以解决的意外副作用。
猜你喜欢
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2011-09-07
  • 2016-09-27
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多