【问题标题】:msbuild reference assemblies resolve order while building solution with multiple .csproj in visual studiomsbuild 参考程序集在 Visual Studio 中使用多个 .csproj 构建解决方案时解析顺序
【发布时间】:2018-03-15 13:11:59
【问题描述】:

我有一个包含多个项目的解决方案,这些项目安装了 nuget 软件包,它们的版本不同。在重建解决方案时看起来,复制到输出目录的 dll 版本不是确定性的,并且由于显而易见的原因,我经常会出现运行时“file not found”异常。我将尝试通过以下示例简单地解决问题:

假设 ProjectA 是 cossole 应用程序并引用程序集 xyzversion 1.0.0

ProjectA 还通过项目参考在同一解决方案中引用 ProjectB。现在假设ProjectB 引用version 2.0.0 的程序集xyz

我想知道何时重建解决方案,是否确定将哪个版本的xyz dll 复制到输出目录?如果没有,有没有办法确保这一点。我知道在这种情况下我需要使用适当的绑定重定向策略更新配置。

【问题讨论】:

  • 这应该由 MSBuild 解决,它会查看引用及其依赖关系并尝试找到解决方案。根据需要将 BindingRedirects 添加到配置文件中,以使 CLR 相信它可能会起作用。如果没有详细的构建跟踪,它只是在猜测为什么没有发生这种情况。考虑链接到一个粘贴箱来回答这个问题。
  • @HansPassant :这里是 link 粘贴 bin。所以它是日志 - projectA(控制台应用程序)指的是 ProjectB 类库。 ProjectB 指的是 Newtonsoft.json.dll 的 8.0.0 版本,而 ProjectA 具有 Newtonsoft.json.dll 的 11.0.0 版本。但是,重建后我的最终 o/p 目录的版本为 11.0.0。我试图从日志中了解 msbuild 是否最初复制了 8.0.0 版本,然后用 11.0.0 版本覆盖它。

标签: c# visual-studio msbuild assembly-resolution


【解决方案1】:

我想知道何时重建解决方案,是否确定将哪个版本的 xyz dll 复制到输出目录?

是的,xyz dll的version 1.0.0将被复制到输出目录。

根据文档Dependency resolution with PackageReference

当应用程序的包图包含不同版本时 对于同一个包,NuGet 会选择最接近 图中的应用程序并忽略所有其他应用程序。这种行为允许 覆盖任何特定包版本的应用程序 依赖图。

在您的情况下,xyz.dll 的 1.0.0 版本更接近图中的projectA,该版本将被复制到输出目录。

然后我还创建了一个测试包xyz,版本为1.0.0和2.0.0,将这两个nuget包添加到projectAprojectB,然后ProjectA也指ProjectB,之后build,将1.0.0版本的xyz.dll复制到输出目录:

更新:

您能否检查并确认 dll 版本为 ProjectA 和 ProjectB 不同\

为了验证这个问题,我创建了一个项目xyz,生成版本1.0.0 xyz.dll2.0.0 xyz.dll,然后将2.0.0 xyz.dll引用到project B1.0.0 xyz.dllproject A,构建解决方案,得到相同的结果:1.0.0 xyz.dll 将被复制到输出目录:

如上测试结果,1.0.0 xyz.dll会被复制到输出目录。当遇到文件未找到错误时,请检查您是否调用了xyz.dll 2.0.0版本中的方法。

更新2:

您显示的屏幕截图显示文件版本(但文件版本不是 和汇编版本一样)

那是因为我想在windows资源管理器中查看AssemblyVersion更方便,所以在生成不同版本的dll之前,我同时更改了AssemblyVersionAssemblyFileVersion

喜欢:

1.0.0 xyz.dll:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

2.0.0xyz.dll:

[assembly: AssemblyVersion("2.0.0.0")]
[assembly: AssemblyFileVersion("2.0.0.0")]

所以我们只需要在wondows explorer中查看文件版本而不是汇编版本就可以了。

希望这会有所帮助。

【讨论】:

  • 谢谢!!但我不是指 nuget 或文件版本,我指的是程序集版本。但根据你的解释,看起来它仍然会选择确定性版本 1.0.0 的程序集。您能否检查并确认 ProjectA 和 ProjectB 中 dll 版本不同时的行为 \
  • @RahulAgarwal,您的意思是直接将不同版本的 dll 文件引用到项目 A 和项目 B?
  • 是的,我认为我在 OP 中说不同的 nuget 版本有点误解。但我假设人们会采用不同的 nuget 包版本,也会有不同的程序集版本。
  • @RahulAgarwal,我已经用不同版本的 dll 文件直接对项目 A 和项目 B 进行了测试,但得到了相同的结果。详情请查看我更新的答案。
  • 谢谢!!是否有任何文档说明 msbuild 如何解析程序集参考图。 “接近”的概念是否也适用于这种情况。也仅供参考..屏幕截图显示文件版本(但文件版本与程序集版本不同)
猜你喜欢
  • 2015-11-15
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多