使用同一DLL的多个版本

时间:2011-05-06 20:47:58

标签: c# visual-studio-2010 .net-4.0 reference

我的任务是为应用程序创建一个新模块,因此,我正在为项目添加新的DLL。这一切都很好。

然而,在我的DLL中,我想使用新版本的外部DLL(我无法控制)。如果我只引用新的DLL并仅使用那个DLL,我的代码将起作用,但旧代码将停止运行。

Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral,
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's
manifest definition does not match the assembly reference. (Exception from HRESULT:
0x80131040)

我尝试过一个改变DLL名称的简单技巧,但这显然对我来说太天真了,认为它会起作用。我已经尝试使用外部别名(通过在我的引用中定义它们),但我仍然不知道如何将两个具有相同名称的文件放入一个BIN文件夹...

我该怎么办?

4 个答案:

答案 0 :(得分:14)

你可以load another version into a specific AppDomain

可能过于详细,但这篇文章演示了如何在有用的环境中使用AppDomains以及它们的工作方式:

http://msdn.microsoft.com/en-us/magazine/cc164072.aspx

从最基本的意义上讲,它归结为此示例代码:

    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
    ...

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        if (/*some condition*/)
            return Assembly.LoadFrom("DifferentDllFolder\\differentVersion.dll");
        else
            return Assembly.LoadFrom("");
    }

答案 1 :(得分:5)

另一个可行的选择是使用extern,如下所述:

http://blogs.msdn.com/b/abhinaba/archive/2005/11/30/498278.aspx

答案 2 :(得分:2)

如果AppDomains解决方案不适用于您的情况,那么您将面临时间压力,需求相互冲突(例如 ),并且不介意可笑的恶意攻击:

  • 使用ildasm工具(Visual Studio附带的Developer Command Prompt的一部分)反编译较新版本的程序集
  • 编辑生成的.il文件以查找/替换程序集命名空间引用。使用引用的示例,这将是从 itextsharp.X itextsharp.new.X
  • 的更改
  • 同样,编辑AssemblyTitleAttribute的值。这需要将ASCII字符转换为十六进制。
  • 使用ilasm
  • 重新编译.il文件
  • 请注意,对于任何依赖程序集,可能需要重复此操作(例如 - someassembly.core.whatever)
  • 使用不同的名称将新的.dll添加到项目中并明确引用它们(而不是通过nuget或其他)
嘿,不要那样看着我。我确实说过荒谬的做作黑客...

答案 3 :(得分:1)

您还可以依赖http://msdn.microsoft.com/en-us/library/2fc472t2.aspx中描述的强命名程序集的程序集绑定重定向。

您只有一个版本的文件(最新版本),两个引用都会解析它。