需要一种方法来引用同一个第 3 方 DLL 的 2 个不同版本

cod*_*etc 5 c# dll

我有一个包含 2 个项目的解决方案:Proj1 和 Proj2,其中 Proj1 是启动项目。

Proj1 引用 Proj2(为了调用 Proj2 的类)并且它有现有的代码,该代码还引用了一个名为 A 的第 3 方 DLL,版本为 1.0.0.0。

Proj2 引用了相同的第 3 方 DLL A,但它在 2.0.0.0 版中引用了它,因为该项目中的类需要较新的实现,而 1.0.0.0 中没有。

到目前为止,我已经尝试了以下操作: 1. 引用 A 时将“特定版本”切换为 true 2. 在 Proj2 中添加了一个名为“v2Folder”的文件夹并将 A v2.0.0.0 添加到其中,将其“复制到输出目录” " to Copy Always 3. 向 app.config 添加了“探测路径”以指向带有 v2.0.0.0 DLL 的子文件夹

我想要的是在普通\bin\文件夹中看到A v1.0.0.0,在\bin\v2Folder中看到A v2.0.0.0,我希望当我运行我的Proj1.exe时,Proj1的旧代码仍然会调用A v1.0.0.0的方法,调用Proj2实现的只调用A v2.0.0.0的方法。

问题是,当我构建我的解决方案时,v1.0.0.0 被 v2.0.0.0 取代,构建日志中有类似“无法解决“A、版本 = 2.0.0.0、文化 = 中性、 PublicKeyToken=blah”和“A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=blah”。任意选择“A, Version=2.0.0.0, Culture=neutral, PublicKeyToken=blah”。

有人可以帮忙吗?

Ora*_*ace 5

即使两个dll版本具有相同的公共令牌也是可以实现的。

这是实现此目的的步骤:

  • 确保将两个版本的dll复制到目标目录
    • 添加两个dll作为项目的内容项
    • 为两者启用本地副本
  • 确保在编译时会引用两个版本的dll
    • 在项目中添加两个dll作为引用
    • 为两者禁用本地副本

仅添加引用是不够的,因为只会复制较新的引用(即使您为两者都启用了本地复制)。这给出了一个这样的项目树:

项目树

  • 确保在编译时可以区分两个版本的dll
    • 为至少一个引用添加别名

别名字段位置

  • 使用 extern 别名引用代码中的库(请参阅 @drf响应

示例代码

此时您可以编译,但在运行时仍然存在问题。要解决这些问题:

自动生成绑定重定向复选框位置

  • 编辑app.config以添加assemblyBinding.
    • assemblyIdentity 是相关的dll。
    • bindingRedirect将版本范围 ( oldVersion)映射到固定版本 ( newVersion)。
    • codeBase将固定映射version到文件路径 ( href)。

bindingRedirect newVersion并且codeBase version必须匹配和匹配使用的 dll 的版本。

在这里,都是关于dll 程序集版本,而不是文件版本 app.config 示例

这是程序输出:

控制台输出

在此处获得此 hack 源代码。

编辑:正如sharpiro所评论的,在构建项目时仍然会出现警告,这与女巫的这个msbuild错误有关,这个答案是一种解决方法。


Ser*_*-Tm 0

将第 3 方 dll 版本 2.0 重命名为 A_2.dll,并添加对重命名的 dll 的引用。