当我尝试构建 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 日志文件会发现以下差异:
- 目标
AssignProjectConfiguration
在错误构建中被跳过,但在良好构建中运行 - 好构建中跳过了许多目标
GetInstalledSDKLocations
,但坏构建中没有提到 - 任务在良好构建
ResolveAssemblyReference
中传递,但在不良构建中不传递。Assemblies
Implicit=true
- 任务在bad build
ResolveAssemblyReference
中传递了 task 参数TargetFrameworkDirectories
,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\
但 good build 将 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 以某种方式更改为旧版本。我不知道是什么改变了目标文件。