当程序集路径和版本不同时,Assembly.LoadFrom返回相同的程序集

时间:2011-12-16 13:58:58

标签: c# .net assemblies

想象一下这种情况:

var ass1 = Assembly.LoadFrom(@"C:\Work\3.59\assembly1.dll");
var ass2 = Assembly.LoadFrom(@"C:\Work\3.60\assembly1.dll");

Debug.Assert(ass1 != ass2);

上述断言失败。即使上面的两个程序集具有不同的版本和位置,第二个调用似乎也会返回第一个程序集。

程序集没有强名称,无法签名。

有没有办法强制框架在相同的上下文和域中加载它们?

3 个答案:

答案 0 :(得分:6)

改为使用Assembly.LoadFile(path)

来自MSDN

  

LoadFrom方法具有以下缺点。考虑使用   改为加载。

     

如果已加载具有相同标识的程序集,则为LoadFrom   即使指定了不同的路径,也会返回已加载的程序集。

来自CLR developer Suzanne Cook's blog

  

如果程序集没有强名称,则忽略该版本   捆绑。但是,如果它被强烈命名,那么整个版本就可以了   程序集引用需要匹配找到的程序集。

答案 1 :(得分:2)

是的,您可以使用Assembly.LoadFile()。 http://blogs.msdn.com/b/suzcook/archive/2003/09/19/loadfile-vs-loadfrom.aspx

答案 2 :(得分:0)

我今天找到了解决这个问题的解决方案 - 只是在构建类库项目之前对程序集进行签名。因为Assembly.LoadFrom(string assemblyPath)方法每次都会加载程序集,无论这些程序集名称是否相同,只要这些程序集是强命名程序集。