msbuild 参考程序集在 visual studio 中使用多个 .csproj 构建解决方案时解析顺序

msbuild reference assemblies resolve order while building solution with multiple .csproj in visual studio

我有一个包含多个项目的解决方案,这些项目安装了 nuget 个版本不同的包。当解决方案重建时,复制到输出目录的 dll 版本是不确定的,而且我经常以运行时“找不到文件”异常结束,原因很明显。我将尝试通过以下示例简单地解决问题:

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

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

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

I would like to know when solution is rebuild, is it deterministic which version of xyz dll will be copied to output directory?

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

根据文档Dependency resolution with PackageReference

When the package graph for an application contains different versions of the same package, NuGet chooses the package that's closest to the application in the graph and ignores all others. This behavior allows an application to override any particular package version in the dependency graph.

在你的例子中,xyz.dll 的版本 1.0.0 更接近图中的 projectA,该版本将被复制到输出目录。

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

更新:

Can you check and confirm on the behavior when dll version is different in ProjectA and ProjectB \

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

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

更新2:

screen shot you showing says file version (but file version is not same as assembly version)

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

喜欢:

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")]

所以我们只需要在windows资源管理器中检查文件版本而不是程序集版本,这样更方便。

希望这对您有所帮助。