运行 MSBuild 失败,无法读取 SDKToolsPath。

134

您好,我遇到了一些问题。我运行一个NAnt脚本,用于构建基于.Net 2.0的网站。在使用VS2008及其相关工具进行编译时,这个脚本能够正常工作。但是最近我将所有项目/解决方案文件升级到了VS2010,现在我的构建失败,并显示以下错误:

 

[exec]    C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets(2249,9):    错误MSB3086:任务无法找到“sgen.exe”,使用SDKToolsPath“”    或注册表键    “HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft    SDKs \ Windows \ v7.0A”。确保    SdkToolsPath已设置,并且工具存在于正确的处理器    特定位置下的SdkToolsPath,以及Microsoft    安装了Windows SDK

现在,我在构建服务器上安装了先前版本(.Net 3.5)的Windows SDK,完整的.Net 4.0框架已经安装。但是我没有找到 .Net 4.0特定版本的Windows SDK。

经过一番实验和研究,我最终只需设置一个新的环境变量"SDKToolsPath"并将其指向我的Windows 6.0 SDK文件夹中的sgen.exe副本。这生成了相同的错误,但它让我注意到即使SDKToolsPath环境变量已设置(确认我可以在命令行中“echo”它并且它具有预期的值),错误消息似乎表明它没有被读取(请注意空引号)。

我找到的大部分信息都是针对.Net 3.5(或更早版本)的。目前没有太多4.0相关的信息。搜索错误代码MSB3086也没有产生有用的结果。您知道这可能是什么问题吗?

Scott


本帖涉及的问题。我也在那里发布了答案。https://dev59.com/WnNA5IYBdhLWcg3wC5Xh#2758894 - Diego C.
25个回答

227

我无法面对在构建服务器上安装Visual Studio。

SDK v7.0A是与Visual Studio 2010一起安装的SDK(A表示这是VS版本)。从那时起,已经发布了更新的版本。Microsoft Windows SDK for Windows 7和.NET Framework AKA v7.1

我在我的构建服务器上安装了它。然后通过Windows SDK 7.1命令提示符(开始=>所有程序=> Microsoft Windows SDK 7.1)设置默认版本为7.1。

步骤:

cd Setup

WindowsSdkVer.exe -version:v7.1

编辑以包含LordHits的评论:不需要安装整个SDK。只需安装".NET开发/智能提示和参考程序集"和".NET开发/工具"选项即可。


4
这对我非常有效,再加上把文件从我的 VS 机器复制到 C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\WebApplications 中。 - dnolan
1
我遇到了与原作者相同的问题,而这个答案解决了它!我不需要在我的构建机器上安装Visual Studio 2010。 - SolutionYogi
37
为了澄清一下,安装整个SDK是不必要的。只需要安装“.NET开发/智能感知和参考程序集”和“.NET开发/工具”选项就足够了。还有,复制dnolan评论中的文件。 - LordHits
为了让我的TeamCity在生成2.0卫星程序集的同时运行MSBuild 4.0,我不得不设置ResGenExecuteAsTool:http://stackoverflow.com/questions/12354625/how-to-change-the-resgen-command-line-in-a-vs-net-project/12354819#12354819 - Grimace of Despair
从注册表中删除HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A有所帮助。 - Foole
显示剩余6条评论

23

只需在 MsBuild 中传递 GenerateSerializationAssemblies 参数,值为 Off。

msbuild.exe /p:GenerateSerializationAssemblies=Off

8
生成不包含序列化程序集的 MSBuild.exe。 - Daniel B
3
或者在 Web 服务项目属性的“生成”选项卡中设置“生成序列化程序集: 关闭”。 - samneric
7
这具体是做什么的? - crush
1
注意:如果你在构建选项卡中关闭它,请确保你针对相关的构建配置进行操作(位于构建选项卡顶部的下拉菜单),在我的情况下,只有出现问题的构建服务器需要更改“发布”配置。 - Myster
17
我喜欢随意更改编译标志,虽然不知道它们实际上是做什么。 - AaronLS

15

我不得不咬紧牙关,在我们的构建服务器上安装 VS 2010 来解决这个问题。据我所知,在 MSDN 上没有任何 7.0A 版本的 Windows SDK 可用。然而,安装 VS 2010 程序似乎会自动安装它,创建一个 7.0A 的 regkey 和一个位于 Program Files\Microsoft SDKs\Windows 目录下的 7.0A 文件夹。


9
我不想在服务器上安装Visual Studio 2010。我更喜欢以下Simmo的建议,将当前的Windows SDK设置为v7.1。WindowsSdkVer.exe位于C:\Program Files\Microsoft SDKs\Windows\v7.1\Setup中(假设它安装在C:\Program Files中)。 - Philippe
55
我发现如果只安装Windows SDK 7.1和.NET 4.0,MSBuild不会正确设置SDK40ToolsPath和SDK35ToolsPath的路径。为了解决这个问题,我需要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0中更改一些条目:"SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools-x86@InstallationFolder)"同样地,在SDK35ToolsPath和FrameworkSDKRoot中将"v7.0A"更改为"v7.1"。 - BlueMonkMN
7
天呐,我又遇到了同样的问题,搜索了一下发现找到了自己的答案! :) 似乎某些东西重置了我的更改,我想我得手动重新应用它。 - BlueMonkMN
3
啊!最新的.NET 4.0补丁(2011-08-11)覆盖了这些注册表设置! - si618
8
关于我之前的回复,需要更新HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\4.0下类似值的内容,如果是64位操作系统,还需要更新HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\11.0和HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\4.0\11.0中的值,可能需要安装8.0 SDK。我已经完成了上述所有步骤,但没有安装8.0 SDK,在将我的所有更新包含在所有4.0\11.0节点中之前,我无法编译。 - BlueMonkMN
显示剩余10条评论

15

我在构建服务器上手动传递变量给MSBuild。

msbuild.exe MyProject.csproj "/p:TargetFrameworkSDKToolsDirectory=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools" "/p:AspnetMergePath=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools"

1
这就是我在没有Visual Studio和Build Tools 2019的服务器上为Windows 10 SDK所做的事情。其他解决方案似乎都没有帮助,而这个解决方案以一种干净的方式解决了问题。 - Nicolás Fantone

8

最近在我们的构建服务器上遇到了类似的问题。

我从我的电脑(已安装VS2010)复制了7.0A文件夹(C:\Program Files\Microsoft SDKs\Windows\7.0A),并将其放置在构建服务器的同一位置。

在创建以下注册表键之后:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A。将InstallationFolder设置为C:\Program Files\Microsoft SDKs\Windows\7.0A。

如果您对在构建服务器上如何处理注册表感到困惑,您还可以参考已经安装有VS2010的计算机上的注册表。


对我来说,Simmo的答案没有起作用 - 这个注册表修改方法起了作用(Win 2K3 SP2)。 - FinnNk

7

我曾经遇到过同样的错误,但情况略有不同:我正在使用 VS 2010 Express 并尝试使用Simmo的答案以显式设置SDK版本 - 但是WindowsSdkVer.exe(版本设置工具)似乎无法针对Express进行设置(可以理解,毕竟它受到限制)。

我正在使用Win 7 Prof上的VS 2010 Express,并且它总是想要使用v7.0A的Win SDK(该版本没有所有所需的exes),无论我显式设置的当前版本是哪个(使用WindowsSdkVer.exe)。它一直报告已经将SDK的当前版本设置为VS 2008,即使我只安装了2010 Ex版本。

因此,我采用了一个简单实用的方法,即安装v7.0 WIN SDK(或其他版本,如v7.1),然后将其文件系统文件夹重命名为v7.0A - 基本上,我只是欺骗了VS 2010 Express,但现在它可以正常工作了!


5

您的一个项目使用sgen.exe(服务器生成器)生成Web服务。您需要安装SDK来构建服务器,或从项目中删除Web服务引用。


1
或者在 Web 服务项目属性的生成选项卡中设置“生成序列化程序集: 关闭”。 - samneric
1
注意:如果你在构建选项卡中关闭了它,请确保你针对相关的构建配置进行操作(位于构建选项卡顶部的下拉菜单),在我的情况下,只有出现问题的构建服务器需要更改“发布”配置。 - Myster

5
在一台全新的Windows 10机器上,我遇到了同样的问题。我的设置如下:
  • Windows 10
  • 已安装Visual Studio 2015
  • Windows 10 SDK
但是我无法构建.NET 4.0项目:

"AL.exe"任务无法使用SdkToolsPath值""或注册表键"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFx40Tools-x86"

解决方法: 在尝试(并失败)安装Windows 7 SDK后(因为该SDK还包括.NET 4.0 SDK),我需要安装Windows 8 SDK并确保已安装".NET Framework 4.5 SDK"。
虽然有点疯狂... 但它起作用了。

这个对我在Windows 10上也有帮助。 - bourbert

4
我怀疑targets文件正在覆盖tools路径,我快速查看了该文件,并在其中的某些目标下设置了SDKToolsPath为$TargetFrameworkSDKToolsDirectory。我不认为您需要在环境中设置这些内容,但它们可能需要在您的项目文件中进行修复。
请注意,根据此页面http://nant.sourceforge.net/,Nant不支持 .Net 4.0版本,这可能是真正的问题吗?
对不起,我知道这并没有真正回答您的问题:(

正确,NAnt尚不支持VS2010的项目/解决方案文件格式,这就是为什么我要调用MSBuild进行实际编译步骤的原因。我会查看目标文件。 - Scott Mayfield

3

您实际上没有安装SDK版本7.0A?这是一个需要解决的问题。请查看VS2010安装日志文件,以查看出了什么问题。SDK应该存在于c:\ program files \ microsoft sdks \ windows \ 7.0a中,并且列出的注册表键也必须存在。使用6.0a版本的sgen.exe不可以,它绑定使用错误的编译器。


1
请记住,这是一个构建服务器,因此安装完整的VS2010环境不是我的首选。我无法找到可用的Windows SDK 7.0a下载。 - Scott Mayfield
3
我看不出问题所在。在配置与开发机不匹配的机器上运行构建,这是一个会让你很快疲惫的问题。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接