msbuild 参考程序集在 visual studio 中使用多个 .csproj 构建解决方案时解析顺序
msbuild reference assemblies resolve order while building solution with multiple .csproj in visual studio
我有一个包含多个项目的解决方案,这些项目安装了 nuget
个版本不同的包。当解决方案重建时,复制到输出目录的 dll 版本是不确定的,而且我经常以运行时“找不到文件”异常结束,原因很明显。我将尝试通过以下示例简单地解决问题:
假设 ProjectA
是 cossole 应用程序并引用程序集 xyz
的 version 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 包添加到 projectA
和 projectB
,然后 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.dll
和2.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
更方便,所以我在生成之前同时更改了AssemblyVersion
和AssemblyFileVersion
不同版本的 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资源管理器中检查文件版本而不是程序集版本,这样更方便。
希望这对您有所帮助。
我有一个包含多个项目的解决方案,这些项目安装了 nuget
个版本不同的包。当解决方案重建时,复制到输出目录的 dll 版本是不确定的,而且我经常以运行时“找不到文件”异常结束,原因很明显。我将尝试通过以下示例简单地解决问题:
假设 ProjectA
是 cossole 应用程序并引用程序集 xyz
的 version 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 包添加到 projectA
和 projectB
,然后 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.dll
和2.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
更方便,所以我在生成之前同时更改了AssemblyVersion
和AssemblyFileVersion
不同版本的 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资源管理器中检查文件版本而不是程序集版本,这样更方便。
希望这对您有所帮助。