动态加载程序集的多个版本

时间:2012-04-11 18:54:56

标签: c# .net assemblies

我正在编写一个测试应用程序来执行一些回归测试。我们的想法是能够在库的多个版本上运行测试。我的目标是在字典中加载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个不同的版本,但它仍然抛出相同的异常。

对此有什么解决方法?

乔丹

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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