我有一个包含 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”。
有人可以帮忙吗?
即使两个dll版本具有相同的公共令牌也是可以实现的。
这是实现此目的的步骤:
仅添加引用是不够的,因为只会复制较新的引用(即使您为两者都启用了本地复制)。这给出了一个这样的项目树:
此时您可以编译,但在运行时仍然存在问题。要解决这些问题:
app.config
以添加assemblyBinding
.
assemblyIdentity
是相关的dll。bindingRedirect
将版本范围 ( oldVersion
)映射到固定版本 ( newVersion
)。codeBase
将固定映射version
到文件路径 ( href
)。bindingRedirect newVersion
并且codeBase version
必须匹配和匹配使用的 dll 的版本。
在这里,都是关于dll 程序集版本,而不是文件版本
这是程序输出:
可在此处获得此 hack 源代码。
编辑:正如sharpiro所评论的,在构建项目时仍然会出现警告,这与女巫的这个msbuild错误有关,这个答案是一种解决方法。