【问题标题】:Dynamically loading multiple versions of an assembly动态加载程序集的多个版本
【发布时间】:2012-04-11 18:54:55
【问题描述】:

我正在编写一个测试应用程序来执行一些回归测试。这个想法是能够在库的多个版本上运行测试。我的目标是将dll加载到字典中,其中键是版本字符串(例如“3.0.0.0”),值是Assembly实例。我能够动态加载一个程序集并在其上调用一个方法,但是当我尝试加载第二个程序集时,出现以下异常:

The located assembly's manifest definition does not match the assembly reference.

我正在使用以下行加载程序集:

asm = Assembly.LoadFrom(lib, hash, System.Configuration.Assemblies.AssemblyHashAlgorithm.MD5);

'lib' 是 dll 的完整文件名和路径。 'hash' 是 dll 的 md5 和。

我看起来即使我告诉 Windows“使用这个 dll”,它也会查看名称并说“我已经拥有那个”并使用之前加载的一个,并且由于哈希不匹配,所以它失败了。本来加载的dll没有设置Assembly Version,所以我设置了4个不同的版本,但是还是抛出了同样的异常。

有什么办法解决这个问题?

乔丹

【问题讨论】:

  • 你试过加载程序集的字节数组吗?
  • 是的,尽管该方法已被弃用。还是不行。
  • 我猜,比起在单独的应用程序域中加载程序集然后卸载应用程序域将是您最好的选择。 :)

标签: c# .net assemblies


【解决方案1】:

您不能将同一程序集的多个版本加载到单个 AppDomain 中。同样,一旦加载,程序集就无法从 AppDomain 中卸载(.NET 4 中动态创建的临时程序集除外),但可以卸载整个 AppDomain(卸载所有加载到其中的程序集)。因此,您必须将程序集的每个版本加载到单独的(新创建的)AppDomain 中。还要非常小心,不要在各个 AppDomain 之间传递对已加载程序集的任何引用(尤其是对您的测试应用程序所在的主 AppDomain),因为否则 .NET 将尝试将程序集加载到每个 AppDomain 中,其中出现对此程序集的引用并且您最终会再次出现同样的错误。

【讨论】:

  • 您从何处获得此信息?使用this answer 中的代码,我能够将同一个程序集的不同版本加载到同一个AppDomain 中。我错过了什么吗?
  • 我也很好奇这个问题的成功方法的偏差。当然,人们已经使用了@blachniet 所指的代码,但无数其他人表示相反。有什么不同?似乎您可以加载同一程序集的不同版本,然后从每个将执行不同代码的同名类型创建。如果您没有通过程序集创建类型,而只是通过 Activator 创建类型名,是否可以肯定地说这会中断?或者你想要在 之后做什么的关键区别,例如,卸载 dll?
  • 基本上,我需要知道是否应该创建一个可以处理多个插件版本的AppDomain,然后卸载,或者我是否必须为每个插件版本创建一个AppDomain。
  • @JoeBrockhaus 你有没有想过这个问题?我有一个类似的问题,我想同时加载一个插件的多个版本。
【解决方案2】:

您需要将程序集放入单独的 AppDomain。

【讨论】:

    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2011-04-01
    • 2013-08-13
    相关资源
    最近更新 更多