运行MSBuild无法读取SDKToolsPath

时间:2010-04-28 16:30:36

标签: .net msbuild

你好,在使用VS2008和它的相关工具进行编译时,我遇到了一个运行NAnt脚本的问题,该脚本曾用于正确构建基于.Net 2.0的网站。我最近将所有项目/解决方案文件升级到VS2010,现在我的构建失败并出现以下错误:

  

[EXEC]   C:\ WINDOWS \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets(2249,9):   错误MSB3086:任务找不到   “sgen.exe”使用S dkToolsPath“”   或注册表项   “HKEY_LOCAL_MACHINE \ SOFTWARE \微软\微软   SDKs \ Windows \ v7.0A“。确保   设置了SdkToolsPath和工具   存在于正确的处理器中   具体位置下   SdkToolsPath和那个微软   已安装Windows SDK

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

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

我发现的大多数信息都是特定的.Net 3.5(或更早版本)。还没有多少相关的4.0。搜索错误代码MSB3086也没有任何用处。知道这可能是什么吗?

斯科特

25 个答案:

答案 0 :(得分:226)

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

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

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

步骤:

cd Setup

WindowsSdkVer.exe -version:v7.1

编辑以包含LordHits的评论:一个人不需要安装整个SDK。仅安装“.NET开发/智能感知和参考组件”和“.NET开发/工具”选项就足够了。

答案 1 :(得分:18)

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

msbuild.exe /p:GenerateSerializationAssemblies=Off

答案 2 :(得分:15)

我不得不咬紧牙关并在我们的构建服务器上安装VS 2010来解决此问题。据我所知,MSDN上没有任何版本的Windows SDK可用。但是,安装VS 2010似乎安装它,在Program Files \ Microsoft SDKs \ Windows中创建7.0A regkey和7.0A文件夹。

答案 3 :(得分:9)

我手动将变量传递给构建服务器上的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"

答案 4 :(得分:8)

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

我将7.0A文件夹(C:\ Program Files \ Microsoft SDKs \ Windows \ 7.0A)从我的计算机(安装了VS2010)复制到同一位置的构建服务器上。

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

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

答案 5 :(得分:7)

我遇到了同样的错误,但情况不同:使用 VS 2010 Express 并尝试使用Simmo's answer显式设置SDK版本 - 但是WindowsSdkVer.exe(版本) setter工具)似乎不是针对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,但它现在有效!

答案 6 :(得分:5)

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

答案 7 :(得分:4)

我怀疑目标文件覆盖了工具路径,我快速查看了这个文件,并将SDKToolsPath设置为$ TargetFrameworkSDKToolsDirectory,其中包含一些目标。我认为您无论如何都不需要在环境中设置它们,但它们可能需要修复您的项目文件。

请注意,根据此页面http://nant.sourceforge.net/ Nant不支持.Net 4.0,这可能是真正的问题吗?

抱歉,我知道这并没有真正回答你的问题:(

答案 8 :(得分:3)

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

答案 9 :(得分:3)

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

我遇到了与AL.exe类似的问题,因为我刚刚将这些工具复制到构建计算机而不是安装SDK,因此缺少常用的注册表项。我运行了一个带有诊断输出(/ verbosity:diagnostic)的构建,并注意到定义了几个SDK工具路径:Sdk40ToolsPath,Sdk35ToolsPath和SdkToolsPath。将Sdk40ToolsPath设置为指向相应的SDK版本的bin文件夹为我解决了这个问题。

答案 10 :(得分:3)

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

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

但我无法构建.NET 4.0项目:

Die Aufgabe konnte“AL.exe”mit dem SdkToolsPath-Wert“”oderdemRegistrierungsschlüssel“HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v8.0A \ WinSDK-NetFx40Tools-x86 < / p>

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

这很疯狂......但是很有效。

答案 11 :(得分:2)

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

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

答案 12 :(得分:2)

我们有一个winXP构建pc,并使用Visual Build Pro 6来构建我们的软件。由于我们的一些开发人员使用VS 2010,项目文件现在包含对“工具版本4.0”的引用,据我所知,这告诉Visual Build它需要在某处找到sdk7.x,即使我们只为.NET 3.5构建。这导致它找不到lc.exe。我试图通过将所有宏指向安装在PC上的VS2008附带的6.0A sdk来欺骗它,但这不起作用。

我最终通过下载和安装sdk 7.1来实现它。然后,我为7.0A创建了一个注册表项,并将安装路径指向7.1 sdk的安装路径。现在它很高兴找到兼容的“lc.exe”,并且所有代码编译都很好。我有一种感觉,即使没有安装VS2010,我现在也能够编译.NET 4.0代码,但我还没有尝试过。

答案 13 :(得分:2)

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

在我的情况下,我的项目是针对.NET 3.5的,我必须将密钥HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ ToolsVersions \ 4.0的SDK35ToolsPath设置为$(注册表:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SDKs \ Windows \ v6 .0A \ WinSDKNetFxTools @ InstallationFolder)。一切顺利。

答案 14 :(得分:1)

我遇到了同样的问题并安装了Windows SDK 7.0和Windows SDK 7.1,但这两者都没有解决问题。对我来说问题的原因是违规类库是使用.NET Framework 2.0的Target Framework构建的。

我将其更改为.NET Framework 4.0并在本地工作,并且在Build服务器中检查后成功构建它。

答案 15 :(得分:1)

我有一个类似的问题,特别是msbuild fails: MSB3086, MSB3091: "AL.exe", "resgen.exe" not found

在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

答案 16 :(得分:1)

简答:在.csproj文件中,有一种方法可以使用SGenToolPath指定sgen.exe的路径:

<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>

您的路径可能不同,但SGenToolPath就是您想要的。

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

我们最终在.csproj文件中使用此SGenToolPath设置,而不是在构建服务器上编辑注册表值。在我的本地计算机上编辑注册表值也很有效,但有点复杂,我们不想弄乱构建服务器上的注册表。

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

答案 17 :(得分:1)

首先确保您已经下载了dotNetFx40_Full_x86_x64.exe并已安装(它通常与Visual Stdio绑定)。

然后在System变量中快速设置一个新的Environment Variables。如下: "TargetFrameworkSDKToolsDirectory":"C:\Program Files (x86)\Microsoft SDKs\Windows\vxx.0A\bin\NETFX 4.6.1 Tools" //note:the path:'\vxx.0A\' is a variable indicating your version. it's '\v10.0A\' for me.

答案 18 :(得分:0)

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

答案 19 :(得分:0)

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

我遇到了这个问题并决定检查项目调试设置。

Project =&gt;工具栏属性=&gt;调试 高级编译选项按钮

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

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

然后构建没有错误的项目并运行。

答案 20 :(得分:0)

我刚刚在.sln文件中出现此错误,该文件最初是在Visual Studio 2010中创建的(由Visual Studio 2010和TFS 2010构建)。我修改了解决方案文件,没有构建一个不应该在特定配置中构建的项目,而visual studio更改了解决方案文件的标题:

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中的向后兼容性仍然没有完善。

答案 21 :(得分:0)

尝试使用visual studio的“修复”。它对我有用。

答案 22 :(得分:0)

CMD包装
我已经尝试了所有的东西,甚至更多。什么都没有帮助我。

我为MSBuild和DevEnv.com应用了CMD包装器 这种包装器内部的主要思想是通过从Visual Studio供应调用Command Prompts来创建一个准备好的环境。然后将标准输入参数传递给MSBuild或DevEnv.com。

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

如何使用
我不得不通过调用我的批处理文件包装来替换对MSBuild和DevEnv的调用 我没有改变任何输入参数。作为我的MSBuild包装器调用的示例:

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

准备好的解决方案
事实上,从VS 2010迁移到VS 2015,我遇到了更多的麻烦。但这是第一次也是最艰难的。 所以,我的谦虚rescue recipe for a Build Server就在这里。 我希望,从一开始就很难理解所有这些CMD风格,但任何逻辑都是显而易见的。

<强>提示
MSBuild Command Prompt for Visual StudioDeveloper Command Prompt for Visual Studio
我将它们恰当地用于MSBuild和DevEnv.com。但可能MSBuild命令提示符就足够了。

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

要将所有输入参数传递给我使用CALL MSBuild %*的批处理文件中的MSBuild或DevEnv

答案 23 :(得分:0)

我也在尝试在我那头混乱的工作场所计算机上使用Visual Studio 2017构建插件时遇到了这个问题。如果您在互联网上搜索“无法找到resgen.exe”,则可以找到所有与“ ”类似的建议,只需使用regedit编辑Windows注册表并在此处创建新密钥并复制并粘贴其中的内容即可。将此文件夹放到另一个文件夹中,等等等等。'

我花了数周的时间用regedit弄乱了Windows注册表,可能将十几个子项和复制粘贴的ResGen.exe添加到许多不同的目录中,有时将其放置在“ bin”文件夹中,有时只是将其保存在主文件夹等

最后,我意识到,“嘿,如果Visual Studio提供了更详细的错误消息,那么这都不是问题。”因此,为了获取有关该错误的更多详细信息,我从命令行在* .csproj文件上直接直接运行了MSBuild.exe:

 "C:/Windows/Microsoft.NET/Framework/v4.0.3.0319/MSBuild.exe C:/Users/Todd/Plugin.csproj -fl -flp:logfile="C:/Users/Todd/Desktop/error_log.log";verbosity=diagnostic"

当然,您必须更改路径详细信息以适合您的情况,但请务必放入1)MSBuild.exe的完整路径2)* .csproj文件的完整路径3)-fl -flp:logfile =部分,它将告诉MSBuild创建该过程中每个步骤的日志文件,4)您想要保存* .log文件的位置,以及5); verbosity = diagnostic,基本上只是告诉MSBuild在* .log文件中包含TONS详细信息。

执行完此操作后,构建将照常失败,但是您将看到一个* .log文件,该文件显示 MSBuild查找ResGen.exe文件的确切位置。我发现* .log文件的底部:

Compiling plug-in resources (Task ID:41)
Looking in key SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6.2\WinSDK-NetFx40Tools-x86 (Task ID:41)
Looking in key SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6.1\WinSDK-NetFx40Tools-x86 (Task ID:41)
Looking in key SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\NETFXSDK\4.6\WinSDK-NetFx40Tools-x86 (Task ID:41)
Looking in key SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v8.1a\WinSDK-NetFx40Tools-x86 (Task ID:41)
Looking in key SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v8.0a\WinSDK-NetFx40Tools-x86 (Task ID:41)
MSBUILD: error : Failed to locate ResGen.exe and unable to compile plug-in resource file "C:/Users/Todd/PluginResources.resx"

因此,基本上,MSBuild在五个单独的目录中查找ResGen.exe,然后放弃了。这是您无法从Visual Studio错误消息中获得的详细信息,它可以解决问题:只需使用regedit为这五个位置中的任何一个创建密钥,然后将密钥中的值“ InstallationFolder”,该密钥应指向ResGen.exe所在的文件夹(在我的情况下为“ C:\ Program Files \ Microsoft SDKs \ Windows \ v10.0A \ bin \ NETFX 4.7.2工具“)。

如果您是像我这样的人文科学专业,没有计算机背景,则可能会遇到这样的错误,很想直接编辑Windows注册表中的内容,然后在各处复制并粘贴ResGen.exe。 (当然,这是错误的做法)。最好遵循上述步骤:1)直接在* .csproj文件上运行MSBuild.exe,以查找MSBuild正在寻找ResGen.exe的确切位置,然后2)精确编辑Windows注册表,以便MSBuild可以找到ResGen。

答案 24 :(得分:0)

我通过将此作为命令行参数传递给msbuild.exe来解决它:

您的里程会根据系统上的SDK版本而有所不同

/p:TargetFrameworkSDKToolsDirectory="C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools