代码之家  ›  专栏  ›  技术社区  ›  rahulaga-msft

msbuild引用程序集在生成具有多个引用的解决方案时解析顺序。visual studio中的csproj

  •  0
  • rahulaga-msft  · 技术社区  · 6 年前

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

    比如说 ProjectA 是cossole应用程序并引用 version 1.0.0 组件的 xyz

    项目A 也指 ProjectB 通过项目参考使用相同的解决方案。现在让我们说 项目B 参考文献 version 2.0.0 组件的 xyz公司

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Leo Liu    6 年前

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

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

    根据文件 Dependency resolution with PackageReference :

    应用程序的包图包含不同版本时 同一包装, NuGet选择最接近 应用程序,忽略所有其他应用程序 。此行为允许 覆盖中任何特定包版本的应用程序 依赖关系图。

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

    然后我还创建了一个测试包 xyz 在版本1.0.0和2.0.0中,将这两个nuget包添加到 项目A projectB 然后 ProjectA 也指 ProjectB ,生成后,版本为1.0.0 xyz。dll复制到输出目录:

    enter image description here

    更新时间:

    当dll版本为 项目A和项目B不同\

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

    enter image description here

    根据上述试验结果, 1.0.0 xyz。动态链接库 将复制到输出目录。当您收到“找不到文件”错误时,请检查您是否在版本2.0.0的xyz中调用该方法。dll。

    更新2:

    显示的屏幕截图显示文件版本(但文件版本不是 与程序集版本相同)

    因为我想检查一下 AssemblyVersion 在更方便的windows资源管理器中,我更改 程序集版本 AssemblyFileVersion 同时,在生成不同版本的dll之前:

    例如:

    1.0.0 xyz。动态链接库 :

    [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中检查文件版本,而不是程序集版本,这样更方便。

    希望这有帮助。

    推荐文章