运行MSBuild无法读取SDKToolsPath

您好,我有一个运行NAnt脚本的问题,用VS2008及其相关工具进行编译时,用于正确构build基于.Net 2.0的网站。 我最近升级了所有的项目/解决scheme文件到VS2010,现在我的生成失败,出现以下错误:

[执行] C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets(2249,9):错误MSB3086:任务使用S dkToolsPath“”或registry找不到“sgen.exe”键“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.0A”。 确保设置了SdkToolsPath,并且该工具存在于SdkToolsPath下正确的处理器特定位置,并且安装了Microsoft Windows SDK

现在,我已经在构build服务器上安装了Windows SDK的早期版本(.Net 3.5),并安装了完整的.Net 4.0框架,但是我没有运行.Net 4.0特定版本的Windows SDK。

经过一番实验和研究,我终于刚刚设置了一个新的环境variables“SDKToolsPath”,并将其指向我的windows 6.0 sdk文件夹中的sgen.exe副本。 这产生了相同的错误,但它让我注意到即使SDKToolsPath环境variablesIS设置(确认我可以在命令行“回显”它,并且它具有期望的值),错误消息似乎表明它是不被阅读(注意空引号)。

我发现的大部分信息都是.Net 3.5(或更早)的具体信息。 那里没有太多的4.0相关。 search错误代码MSB3086也没有任何用处。 不知道这可能是什么?

斯科特

我不得不硬着头皮,在我们的构build服务器上安装VS 2010来解决这个问题。 据我所见,MSDN上没有7.0A版本的Windows SDK可用。 但是,安装VS 2010似乎会安装它,在Program Files \ Microsoft SDKs \ Windows中创build一个7.0A的regkey和一个7.0A的文件夹。

我无法面对将Visual Studio放在构build服务器上。

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),我将SDK的默认版本设置为7.1。

脚步:

cd Setup WindowsSdkVer.exe -version:v7.1 

编辑包括LordHits的评论:一个不需要安装整个SDK。 仅安装“.NET Development / Intellisense和Reference Assemblies”和“.NET Development / Tools”选项就足够了。

只需将GenerateSerializationAssemblies参数的值Off传递给您的MsBuild即可。

 msbuild.exe /p:GenerateSerializationAssemblies=Off 

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

我从我的电脑(已安装VS2010)将7.0A文件夹(C:\ Program Files \ Microsoft SDKs \ Windows \ 7.0A)复制到相同位置的生成服务器。

创build以下registry项后:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v7.0A。 将InstallationFolder设置为C:\ Program Files \ Microsoft SDKs \ Windows \ 7.0A。

如果您对构build服务器上的registry如何处理感到困惑,也可以在已经安装了VS2010的计算机上引用registry。

我遇到了同样的错误,但在不同的情况下:使用VS 2010 Express,并尝试使用Simmo的答案显式设置SDK版本 – 但WindowsSdkVer.exe(版本设置工具)似乎不是目标Express(可以理解,因为它是有限的)。

我在Win 7 Prof.上使用VS 2010 Express,并且总是希望使用Win SDK的v7.0A(它没有全部所需的exes),而且我明确地将其设置为当前使用的版本并不重要WindowsSdkVer.exe(它不断报告它设置SDK的当前版本,但VS 2008,虽然我只有2010 Ex安装。)

所以我廉价的解决方法是安装v7.0的WIN SDK(或其他版本,如v7.1),然后将其文件系统文件夹重命名为v7.0A – 基本上我只是撒谎VS 2010 Express,但它现在的作品!

我怀疑目标文件是覆盖工具path,我有一个快速浏览这个文件,并将SDKToolsPath设置为$ TargetFrameworkSDKToolsDirectory下的一些目标。 我不认为你应该在环境中设置这些,但他们可能需要修复你的项目文件。

请注意,根据这个页面http://nant.sourceforge.net/南特不支持;.NET 4.0,这可能是真正的问题吗?

对不起,我知道这并不真正回答你的问题:(

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

你实际上没有安装SDK版本7.0A? 这是您需要解决的问题。 查看VS2010安装日志文件,查看出了什么问题。 SDK应该存在于c:\ program files \ microsoft sdks \ windows \ 7.0a中,并且列出的registry项也必须存在。 运行6.0版本的sgen.exe并不好,它必然会使用错误的编译器。

设置Sdk40ToolsPath而不是SdkToolsPath来指定安装目录以外的位置。

我碰到了一个与AL.exe类似的问题,因为我只是将这些工具拷贝到构build机器上,而不是安装SDK,所以通常的registry项丢失了。 我运行了具有诊断输出(/ verbosity:diagnostic)的版本,注意到有几个定义的SDK工具path:Sdk40ToolsPath,Sdk35ToolsPath和SdkToolsPath。 设置Sdk40ToolsPath指向适当的SDK版本的bin文件夹解决了我的问题。

我在一台全新的Windows 10机器上遇到了同样的问题。 我的设置:

  • Windows 10
  • Visual Studio 2015安装
  • Windows 10 SDK

但是我无法构build.NET 4.0项目:

Die Aufgabe konnte“AL.exe”mit dem SdkToolsPath-Wert“”oder demRegistrierungsschlüssel“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v8.0A \ WinSDK-NetFx40Tools-x86

解决scheme:在尝试(和失败)安装Windows 7 SDK(因为这也包括.NET 4.0 SDK)之后,我需要安装Windows 8 SDK并确保安装了“.NET Framework 4.5 SDK”。

这很疯狂,但工作。

我同意IanS的回答。 无需安装新的SDK。 只要确保用于MSBuild的registry项值SDK35ToolsPath和SDK40ToolPath指向正确的registry项值。

在我的情况下,我的项目是针对.NET 3.5,我不得不为HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ ToolsVersions \ 4.0键设置SDK35ToolsPath到$(registry:HKEY_LOCAL_MACHINE \软件\微软\微软SDKs \ Windows \ v6.0A \ WinSDKNetFxTools @ InstallationFolder)。 一切正常。

我们有一个winXP构build电脑,并使用Visual Build Pro 6来构build我们的软件。 因为我们的一些开发人员使用VS 2010,项目文件现在包含对“工具版本4.0”的引用,从我所知道的情况来看,这告诉Visual Build需要在某处findsdk7.x,尽pipe我们只为.NET 3.5 。 这导致它找不到lc.exe。 我试图通过将所有的macros指向安装在PC上的VS2008附带的6.0A sdk来愚弄它,但是这并不起作用。

我最终通过下载和安装sdk 7.1来工作。 然后,我为7.0A创build了一个registry项,并将安装path指向7.1 sdk的安装path。 现在它高兴地发现一个兼容的“lc.exe”,所有的代码编译好。 我有一种感觉,即使VS2010没有安装,我现在也可以编译.NET 4.0代码,但是我还没有尝试过。

ToolsVersion =“4.0”为我在我的MSBuild项目中:

 <Project DefaultTargets="Do" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

我手动将这些variables传递给构build服务器上的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"

我有这个相同的问题,并已安装Windows SDK 7.0和Windows SDK 7.1,既不解决问题。 导致这个问题的原因是有问题的类库是用.NET Framework 2.0的目标框架构build的。

我将其更改为.NET Framework 4.0,并在本地工作,并在构build服务器中签入成功。

我有一个类似的问题,特别是msbuild失败:MSB3086,MSB3091:“AL.exe”,“resgen.exe”找不到

在64位的Windows 7机器上,我安装了.Net framework 4.5.1和Windows SDK for Windows 8.1。

虽然SDK的设置表示它是最新的,但可能不是。 我通过删除所有安装的SDK版本解决了这个问题,然后按以下顺序安装以下内容:

http://www.microsoft.com/en-us/download/details.aspx?id=3138

http://www.microsoft.com/en-us/download/details.aspx?id=8279

http://msdn.microsoft.com/en-us/windows/desktop/hh852363.aspx

http://msdn.microsoft.com/en-us/windows/desktop/aa904949.aspx

简而言之:在.csproj文件中,有一种方法可以使用SGenToolPath来指定sgen.exe的path:

 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0"> <PropertyGroup> <SGenToolPath>C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools</SGenToolPath> </PropertyGroup> 

你的path可能不同,但SGenToolPath是你想要的。

有关其他常见MSBuild项目属性的列表,请参阅: https : //msdn.microsoft.com/en-us/library/bb629394.aspx

我们最终在.csproj文件中使用了这个SGenToolPath设置,而不是在编译服务器上编辑registry值。 在我的本地机上编辑registry值的工作也是如此,但有点复杂,我们不想在构build服务器上弄乱registry。

对于registry:在这种情况下,问题是HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ MSBuild下的SDK40ToolsPath(s)指向registry值$(registry:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v8.0A \ WinSDK-NetFx40Tools-x86 @ InstallationFolder)不存在。 我直接用实际的pathreplace了它。

除了registry模块之外,您可能还需要更改在Visual Studio中设置为.net sdk的设置的版本。

我有这个问题,并决定检查项目debugging设置。

Project =>工具栏属性=>debugging高级编译选项button

目标框架(所有configuration)被设置为3.0,这不在我的系统上。

我将其更改为4.0,然后必须重新启动项目和Visual Studio 2010。

该项目然后build成没有错误,跑了。

我有一个类似的问题。 我使用Visual Studio 2010完成了一个项目,然后在使用Visual Studio 2012编译时遇到了上述错误。 我简单地将C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A所有内容复制到C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A并解决了我的问题。

我刚刚在Visual Studio 2010中创build的.sln文件(由Visual Studio 2010和TFS 2010构build)中出现此错误。 我已经修改了解决scheme文件,不build立不应该在特定configuration中构build的项目,而Visual Studio将解决scheme文件的标题从:

 Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 

至:

 Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 

设置回原来的2010版本解决了我的问题。 我猜在Visual Studio中的向后兼容性还没有完善。

尝试使用视觉工作室的“修复”。 它为我工作。

CMD包装
我从这里尝试了所有的东西,甚至更多。 没有什么帮助我。

我为MSBuild和DevEnv.com应用了一个CMD包装器。
这种包装的主要思想是通过调用Visual Studio提供的命令提示符来创build一个准备好的环境。 然后将标准inputparameter passing给MSBuild或DevEnv.com的调用。

无论如何,现在我可以在我的构build服务器上构build来自不同Visual Studio版本的项目。

如何使用
我不得不通过调用我的batch file包装器来调用MSBuild和DevEnv。
而且我没有改变任何input参数。 作为我的MSBuild包装调用的一个例子:

MsBuild_Wrapper.bat MySolution.sln /target Build /property:Configuration=Release

就绪解决scheme
事实上,从VS 2010到VS 2015的迁移,我遇到了更多麻烦,但是这是第一个也是最困难的。
所以,我的一个Build Server的适度救援配方就在这里。 我希望可能从一开始就很难理解这里所有的CMD风格,但任何逻辑都是显而易见的。

提示

MSBuild Command Prompt for Visual Studio Developer Command Prompt for Visual Studio
我使用适当的MSBuild和DevEnv.com。 但可能MSBuild命令提示符就足够了。

对于VS 2015,这些命令提示符在这里是C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\ 。 或者查看Windows程序菜单。

要将所有inputparameter passing给batch file中的MSBuild或DevEnv,我使用了CALL MSBuild %*