MSBuild错误地设置了TargetFrameworkDirectories

时间:2013-03-19 16:38:24

标签: msbuild .net-4.5

当我尝试构建C#控制台应用程序(可能还有其他应用程序)时,似乎TargetFrameworkDirectories设置不正确;特别是它省略了Facades目录。

由于我一直试图诊断问题一段时间,这里列出了可能相关的事实。

  • 当尝试在Visual Studio 2012中构建引用Reactive Extension库(使用NuGet管理)的项目时,问题就出现了。错误(或警告)是warning MSB3267: The primary reference "System.Runtime", which is a framework assembly, could not be resolved in the currently targeted framework. ".NETFramework,Version=v4.5"。在msbuild执行ResolveAssemblyReference
  • 期间会出现此问题
  • 我可以使用msbuild从命令行重现错误,这似乎更简单
  • 其他工作站没有出现此问题。在一台好的机器上运行带有详细程度的msbuild,在坏的机器上运行了日志文件中的一些差异
  • 在一台好机器上TargetFrameworkDirectories(参数ResolveAssemblyReference)是C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\但是在坏机器上它没有第二个条目(Facades目录)
  • 扫描好的和坏的msbuild日志文件,出现以下差异:

    1. 在错误构建中跳过目标AssignProjectConfiguration,但在良好构建中运行
    2. 在良好版本中跳过了许多目标,例如GetInstalledSDKLocations,但在错误构建中未提及
    3. ResolveAssemblyReference任务在良好版本中传递AssembliesImplicit=true,但不在错误版本中传递。{/ li>
    4. ResolveAssemblyReference任务在错误构建中传递了TargetFrameworkDirectories任务参数C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\,但是好的东西构建了Facades目录(见上文)作为第二项。

由于这是由C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets驱动的,因此我将该文件分散在好的和坏的机器上。它们包含许多差异。第一个区别是项目元素(第17行),它在良好的机器上有一个额外的属性TreatAsLocalProperty="OutDir"。在良好的机器上,目标文件包含更多注释,例如<!-- VS10 without SP1 and without VS11 will not have VisualStudioVersion set, so do that here -->。跳转到AssignProjectConfiguration目标,好机器有Condition="'$(CurrentSolutionConfigurationContents)' != '' or '@(ProjectReference)'!=''"而坏机器有Condition="'@(ProjectReference)'!=''"(我假设它解释了为什么它被跳过)。

我尝试的最后一件事是修复“Microsoft .NET Framework 4.5”和“Microsoft .NET Framework 4.5 Multi-Targeting Pack”。它没有帮助。

任何建议都将受到赞赏,特别是如果我可以避免重新安装Visual Studio 2012!

更新:似乎重新安装.NET 4.5后面“仅”修复VS2012解决了我的问题。我最好的猜测是什么导致了这个问题,不知何故我的Microsoft.Common.targets被改为旧版本。我不知道什么可以改变目标文件。

1 个答案:

答案 0 :(得分:0)

正如@leppie所建议的,这是一个.NET问题。由于某些原因,修复.NET似乎没有解决问题。然而,重新安装.NET 4.5(然后修复VS2012)似乎确实解决了这个问题。