gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:11:09 35 4
gpt4 key购买 nike

我有一个包含 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时将“特定版本”切换为true2.在Proj2中添加了一个名为“v2Folder”的文件夹,并在其中添加了A v2.0.0.0,将其“Copy to Output Directory”设置为Copy Always3. 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、Version=2.0.0.0、Culture 之间的冲突”之类的内容=neutral, PublicKeyToken=blah”和“A, Version=1.0.0.0, Culture=neutral, PublicKeyToken=blah”。任意选择“A, Version=2.0.0.0, Culture=neutral, PublicKeyToken=blah”。

有人可以帮忙吗?

最佳答案

即使两个 dll 版本具有相同的公共(public) token 也是可以实现的。

实现步骤如下:

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

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

Project tree

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

Aliases field position

  • 使用外部别名在代码中引用库(参见@drf response)

Example code

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

Auto-generate binding redirects checkbox position

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

bindingRedirect newVersioncodeBase version 必须匹配并匹配使用的dll 的版本。

在这里,都是关于 the dll assembly version, not the file versionapp.config example

程序输出如下:

Console output

此 hack 源代码可用 here .

编辑:作为sharpiro评论了,项目建的时候还是有警告,这个和this msbuild bug有关对于女巫来说,这个答案是一种解决方法。

关于c# - 需要一种方法来引用同一个第 3 方 DLL 的 2 个不同版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550981/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com