.net MSBuild-使用较旧版本的程序集

.net MSBuild-使用较旧版本的程序集,.net,visual-studio-2010,msbuild,tfsbuild,.net,Visual Studio 2010,Msbuild,Tfsbuild,我有: 共享功能库[A] 另一个图书馆 A[A1]的参考文献v1 我当前的Visual Studio解决方案有: 一个dll[L],其中(文件)引用了B 一个WindowsService[S],它(项目)引用了L,并且还有一个对[A2]的更新但向后兼容版本的文件引用 当我在VisualStudio中构建解决方案时,一切正常。S的bin文件夹包含L、B和A2(与B兼容,因此效果非常好) 但是,如果使用MSBuild(通过TeamBuild)进行构建,最终的构建文件夹将以L、B和A1结束。A

我有:

  • 共享功能库[A]
  • 另一个图书馆 A[A1]的参考文献v1
我当前的Visual Studio解决方案有:

  • 一个dll[L],其中(文件)引用了B
  • 一个WindowsService[S],它(项目)引用了L,并且还有一个对[A2]的更新但向后兼容版本的文件引用
当我在VisualStudio中构建解决方案时,一切正常。S的bin文件夹包含L、B和A2(与B兼容,因此效果非常好)

但是,如果使用MSBuild(通过TeamBuild)进行构建,最终的构建文件夹将以L、B和A1结束。A1没有S所需的库A的新功能,因此当您尝试运行它时,S会崩溃


我读过一些文章,认为这和.sln的生成顺序被MSBuild忽略有关

我发现L的bin目录包含B和A1,正如我所预料的,因为其中没有任何内容引用A2。因此,当MSBuild构建了L(本地拉入B和A1)和S(拉入L和A2)时,可能需要将所有二进制文件合并到构建的最终输出中。我不明白的是,是什么让它选择A1(从L箱)而不是A2(从S箱)

我很感激没有什么可以说它应该是另一种方式,但我只是不知道MSBuild使用什么标准来进行此调用


有人能解释一下吗?

Tom teambuild中msbuild的工作方式是,所有项目的所有输出DLL都放在outputdirectory中。此输出目录为解决方案中的所有项目共享。因此,如果同一dll有不同版本,它们将相互覆盖

解决方法是为此类项目使用子目录$(Outdir)\SpecificDir,或者使用版本标记(即a.1.0.dll和a.dll)重命名dll