Visual studio 2015 VS 2015引用了web应用程序的bin dir中更新的DLL,即使未触发构建

Visual studio 2015 VS 2015引用了web应用程序的bin dir中更新的DLL,即使未触发构建,visual-studio-2015,Visual Studio 2015,这让我们抓狂: 在VS 2015中创建新的解决方案 添加一个名为“Dependency”的类项目 添加一个名为“消费”的空web应用程序 在“Dependency”中,添加对Castle.Core版本2.5.2的nuget引用 在“消费”中,添加对Castle.Core版本3.3.3的nuget引用 (您可以使用pacakges.config或project.json-没有区别) 将项目引用从“消费”添加到“依赖” 现在,构建您的整个sln,并调查“消费”的bin dir中Castle.Co

这让我们抓狂:

  • 在VS 2015中创建新的解决方案
  • 添加一个名为“Dependency”的类项目
  • 添加一个名为“消费”的空web应用程序
  • 在“Dependency”中,添加对Castle.Core版本2.5.2的nuget引用
  • 在“消费”中,添加对Castle.Core版本3.3.3的nuget引用 (您可以使用pacakges.config或project.json-没有区别)
  • 将项目引用从“消费”添加到“依赖”
现在,构建您的整个sln,并调查“消费”的bin dir中Castle.Core的版本-果然是3.3.3

然而,现在只做“依赖性”的项目构建。神奇的是,“Consuming”的bin目录中的Castle.Core DLL被更新为2.5.2-即使构建“Dependency”不应触发“Consuming”的构建

现在重复同样的过程,但让“消费”成为一个控制台应用程序-它不会发生

这到底是怎么回事

(我很确定它与nuget无关:我认为它将在常规程序集引用中出现)

更新 @Schwarzie2478要求我在命令行上使用MSBuild尝试相同的序列。正如我所料,上述观察到的行为不会发生,因此这只是一个VS问题:

  • 从干净的bin文件夹开始,MSBuild sln:
PS v5(0.0140067)D:\Temp\DependencyTest\DependencyTest>msbuild/t:Build。\DependencyTest.sln .... 项目“D:\Temp\DependencyTest\DependencyTest\DependencyTest.sln”(1)正在节点1(默认目标)上生成“D:\Temp\DependencyTest\DependencyTest\WebApp\WebApp.csproj”(4)。 .... _CopyFilesMarkedCopyLocal: 正在将文件从“D:\Temp\DependencyTest\DependencyTest\packages\Castle.Core.3.3\lib\net45\Castle.Core.dll”复制到“bin\Castle.Core.dll”。 ... 此时,WebApp\bin\debug中的DLL版本为3.3.3

现在,自行构建依赖项项目-不会触发“消费”构建:

PS v5 (2.8423647) D:\Temp\DependencyTest\DependencyTest> msbuild /t:build .\Dependency\Dependency.csproj ... Project "D:\Temp\DependencyTest\DependencyTest\Dependency\Dependency.csproj" on node 1 (build target(s)). ... CoreCompile: Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files. CopyFilesToOutputDirectory: Dependency -> D:\Temp\DependencyTest\DependencyTest\Dependency\bin\Debug\Dependency.dll Done Building Project "D:\Temp\DependencyTest\DependencyTest\Dependency\Dependency.csproj" (build target(s)). PS v5(2.8423647)D:\Temp\DependencyTest\DependencyTest>msbuild/t:build。\Dependency\Dependency.csproj ... 节点1(生成目标)上的项目“D:\Temp\DependencyTest\DependencyTest\Dependency\Dependency.csproj”。 ... 核心编译: 跳过目标“CoreCompile”,因为所有输出文件相对于输入文件都是最新的。 CopyFilesToOutputDirectory: 依赖项->D:\Temp\DependencyTest\DependencyTest\Dependency\bin\Debug\Dependency.dll 已完成生成项目“D:\Temp\DependencyTest\DependencyTest\DependencyTest\Dependency\Dependency.csproj”(生成目标)。 正如预期的那样,WebApp的“消费”bin dir中不会出现任何副本


如果有人认为这只是一个有趣的转移,那么在一个有许多库项目和匹配单元测试项目的SLN中,这会给像R#这样的测试运行者带来问题,R#将增量构建单元测试项目的依赖关系。这种恶劣的副作用会导致sln中的所有Web应用程序更新其bin文件夹,即使它们没有被单元测试或库项目引用

也许是一个愚蠢的问题,但为什么要保留两个不同的参考资料呢?好吧,这不是一个愚蠢的问题,但不管怎样,这仍然是令人惊讶的行为。。。“依赖关系”是由其他团队维护的常见项目,在许多解决方案中使用。“消费”将声明一个绑定重定向,该重定向将使Dependency.dll中的castle.core代码保持愉快。将msbuild详细信息更改为Detailed,它会对此非常喋喋不休。它将不得不选择一个受害者项目,该项目将获得错误版本的DLL。当然,只有当它知道您的解决方案使用的所有项目时,它才有机会。正如您所发现的,当您只构建一个项目时,没有任何问题。构建跟踪还应该告诉您为什么控制台项目是“特殊的”。主要参考和间接参考之间的区别很重要,第一个是赢家。我想你误解了:我正在VS内部构建一个项目,而sln是开放的。该项目(依赖项)没有引用sln中的另一个项目(正在使用),事实上,并未实际生成正在使用的项目,但DLL在其bin文件夹中被替换。您是否已从命令行生成?我们注意到,在项目解析中,从命令行使用VisualStudio本身(devenv.exe)和使用msbuild进行构建的行为不同。以msbuild为例构建解决方案(当前配置禁用了消费)时会发生什么情况? PS v5 (2.8423647) D:\Temp\DependencyTest\DependencyTest> msbuild /t:build .\Dependency\Dependency.csproj ... Project "D:\Temp\DependencyTest\DependencyTest\Dependency\Dependency.csproj" on node 1 (build target(s)). ... CoreCompile: Skipping target "CoreCompile" because all output files are up-to-date with respect to the input files. CopyFilesToOutputDirectory: Dependency -> D:\Temp\DependencyTest\DependencyTest\Dependency\bin\Debug\Dependency.dll Done Building Project "D:\Temp\DependencyTest\DependencyTest\Dependency\Dependency.csproj" (build target(s)).