2

我正在编写一个测试应用程序来执行一些回归测试。这个想法是能够在库的多个版本上运行测试。我的目标是将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 没有设置程序集版本,所以我将它设置为 4 个不同的版本,但它仍然抛出了相同的异常。

解决方法是什么?

乔丹

4

2 回答 2

5

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

于 2012-04-11T19:36:38.977 回答
1

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

于 2012-04-11T18:58:47.033 回答