运行 MSBuild 时读取 SDKToolsPath 失败

您好,我在运行一个用于正确构建我的。基于 Net 2.0的网站,在使用 VS2008及其相关工具编译时。我最近将所有的项目/解决方案文件升级到了 VS2010,现在我的构建失败了,出现了以下错误:

[执行] C: Windows Microsoft.NET Framework64 v4.0.30319 Microsoft. Common.target (2249,9) : 错误 MSB3086: 任务无法找到 “ sgen.exe”使用“ S dkToolsPath” 或注册表项 ”HKEY _ LOCAL _ MACHINE SOFTWARE 微软 SDKsWindowsv7.0 A” 设置了 SdkToolsPath 并且该工具 存在于正确的处理器中 下的指定位置 SdkToolsPath 和微软 安装了 WindowsSDK

现在,我确实有以前的版本(。NET 3.5) ,而完整的。已经安装了 Net 4.0框架,但是我还没有遇到。Net 4.0特定版本的 Windows SDK。

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

我找到的大部分信息。特定于净值3.5(或更早)。现在还没有多少4.0的相关内容。搜索错误代码 MSB3086也没有产生任何有用的结果。知道这是什么吗?

斯科特

124861 次浏览

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

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

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

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

为了解决这个问题,我不得不咬紧牙关在我们的构建服务器上安装 VS2010。据我所知,在 MSDN 的任何地方都没有 Windows SDK 的7.0 A 版本。但是,安装 VS 2010似乎会安装它,在 Program Files Microsoft SDK Windows 中创建一个7.0 A regkey 和一个7.0 A 文件夹。

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

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

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

步骤:

cd Setup


WindowsSdkVer.exe -version:v7.1

编辑以包含 LordHits 的评论: 一个人不需要安装整个 SDK。只安装“ .NET Development/Intellisense and Reference Assembly”和“ .NET Development/Tools”选项就足够了。

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

我在 AL.exe 中遇到了类似的问题,因为我只是将这些工具 xcopy 到了构建机器上,而没有安装 SDK,所以通常的注册表项不见了。我运行了一个带有诊断输出(/冗长度: 诊断)的构建,注意到定义了几个 SDK 工具路径: Sdk40ToolsPath、 Sdk35ToolsPath 和 SdkToolsPath。设置 Sdk40ToolsPath 指向适当的 SDK 版本的 bin 文件夹为我解决了这个问题。

我遇到过同样的错误,但是在不同的情况下: 使用 VS 2010 Express和尝试使用 西莫的回答显式设置 SDK 版本——然而 WindowsSdkVer.exe (版本设置工具)似乎不是针对 Express 的(可以理解,因为它是有限的)。

我在 Win 7 Prof. 上使用的是 VS 2010 Express,它总是想使用 Win SDK 的 v7.0 A (它没有所有需要的 exe) ,我使用 WindowsSdkVer.exe 明确设置为当前版本并不重要(它一直报告它设置了 SDK 的当前版本,但是 VS 2008版本,尽管我只安装了2010 Ex)

所以我的 廉价的解决办法是安装 v7.0 WIN SDK (或另一个版本像 v7.1) ,然后 将其文件系统文件夹重命名为 v7.0 A-基本上我只是说谎 VS 2010 Express 但它现在工作!

我同意伊恩斯的回答。不需要安装新的 SDK。只需确保 MSBuild 的注册表项值 SDK35ToolsPath 和 SDK40ToolPath 指向正确的注册表项值。

在我的案例中,我的项目是针对。NET 3.5,我必须为关键的 HKEY _ LOCAL _ MACHINE 软件设置 SDK35ToolsPath Microsoft MSBuild ToolsVersions 4.0至 $(注册表: HKEY _ LOCAL _ MACHINE SOFTWARE Microsoft SDKs Windows v6.0 A WinSDKNetFxTools@InstallationFolder)。一切都很顺利。

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

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

创建以下注册表项: HKEY _ LOCAL _ MACHINE SOFTWARE Microsoft SDK Windows v7.0 A。 将 InstallationFolder 设置为 C: Program Files Microsoft SDK Windows 7.0 A。

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

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

除了注册表模块之外,您可能还需要更改。在 VisualStudio 中设置为 net sdk。

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

项目 = > 工具栏属性 = > 调试 “预编译选项”按钮

目标框架(所有配置) 设置为3.0我的系统里没有。

我把它改成了4.0,然后不得不重新启动这个项目 Visual Studio 2010.

然后该项目在没有错误的情况下生成并运行。

我们有一个 winXP 建立个人电脑,并使用 VisualBuildPro 6来建立我们的软件。因为我们的一些开发人员使用 VS 2010,所以项目文件现在包含了对“ tool version 4.0”的引用,据我所知,这告诉 Visual Build 它需要在某个地方找到一个 sdk7.x,即使我们只为。NET 3.5.这导致它找不到 lc.exe。我试图愚弄它指出所有的宏的6.0 A sdk 来与 VS2008是安装在个人电脑上,但没有工作。

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

我也有同样的问题,所以我安装了 Windows SDK 7.0和 Windows SDK 7.1,但是都没有解决这个问题。对于我来说,问题的原因是错误的类库是使用。NET Framework 2.0.

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

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

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

只需将 GenerateSerializationAssembly 参数的值 Off 传递给 MsBuild。

msbuild.exe /p:GenerateSerializationAssemblies=Off

我也遇到过类似的问题,特别是 Msbuild 失败: 找不到 MSB3086,MSB3091: “ AL.exe”,“ resgen.exe”

在一台64位的 Windows 7机器上,我为 Windows 8.1安装了.Net Framework 4.5.1和 Windows SDK。

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

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

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

  • 视窗10
  • 安装 VisualStudio2015
  • Windows 10 SDK

但是我不能构建.NET 4.0项目:

这个任务可以使用“ AL.exe”和 SdkToolsPath-Wert”或注册密码“ HKEY _ LOCAL _ MACHINE”软件 Microsoft SDKs Windows v8.0 A WinSDK-NetFx40Tools-x86

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

很疯狂,但是奏效了。

我刚刚在一个。最初在 VisualStudio2010中创建的 sln 文件(由 VisualStudio2010和 TFS 2010构建)。我已经修改了解决方案文件,不建立一个项目,不应该建立在一个特定的配置和视觉工作室改变了解决方案文件的标题从:

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年版本修复了我的问题。我想 VisualStudio 中的向后兼容性仍然没有得到完善。

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

简短的回答: 在. 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

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

对于注册表: 在这种情况下,问题是 HKLM SOFTWARE Wow6432Node MicrosoftMSBuild 下的 SDK40ToolsPath 指向一个注册表值 $(Registry: HKEY _ LOCAL _ MACHINE SOFTWARE Microsoft SDK Windows v8.0 A WinSDK-NetFx40Tools-x86@InstallationFolder) ,该值不存在。我直接用实际路径替换了它。

CMD 包装纸
我已经尝试了所有的东西从这里,甚至更多。没有任何帮助我。

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

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

怎么用
我必须通过调用批处理文件包装器来替换对 MSBuild 和 DevEnv 的调用。
我没有改变任何输入参数:

MsBuild _ Wrapper.bat MySolution.sln/target Build/property: Configuration = Release

现成的解决方案
事实上,我在从 VS 2010到 VS 2015的迁移中遇到了更多的麻烦。但这是第一次,也是最艰难的一次。
我谦虚的 构建服务器的拯救配方来了。 可能很难从一开始就理解所有这些 CMD 风格,但我希望任何逻辑都是显而易见的。

提示
有的
MSBuild Command Prompt for Visual StudioDeveloper Command Prompt for Visual Studio
我在 MSBuild 和 DevEnv.com 中适当地使用了它们,但 MSBuild 命令提示符可能就足够了。

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

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

我在生成服务器上手动将变量传递给 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"

首先确保您已经下载并安装了 dotNetFx40 _ Full _ x86 _ x64.exe (它通常与 Visual Studio 绑定)。

然后在系统变量中快速设置一个新的环境变量,如下: “ TargetFrameworkSDKToolsDirectory”: “ C: Program Files (x86) Microsoft SDKs Windows vxx.0 A bin NETFX 4.6.1 Tools” //注意: 路径: “ vxx. 0 A”是一个指示您的版本的变量,对我来说是“ v10.0 A”。

我也遇到过这个问题,当时我正试图用 Visual Studio 2017在我那台糟糕透顶的办公电脑上构建一个插件。如果你在互联网上搜索“无法找到 resgen.exe”,你可以找到所有类似于“ 只需使用 regedit 编辑您的 Windows 注册表,并在此创建一个新键,然后将该文件夹的内容复制粘贴到另一个文件夹中,诸如此类。”的建议

我花了几个星期的时间搞乱我的注册表,可能添加了一打子键和复制粘贴的 ResGen.exe 到许多不同的目录,有时把它放在一个“ bin”文件夹,有时只是把它放在主文件夹,等等。

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

 "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) the-fl-flp: logfile = part,它将告诉 MSBuild 创建进程中每个步骤的日志文件,4)您想要 * 的位置。详细性 = 诊断,这基本上只是告诉 MSBuild 在 * 中包含 TONS 的详细信息。日志文件。

执行此操作之后,构建将一如既往地失败,但您将只剩下一个 * 。日志文件显示 正是 MSBuild 查找 ResGen.exe 文件的位置。在我的例子中,靠近 * 的底部。日志文件,我发现:

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.0 A bin NETFX 4.7.2 Tools”)。

如果你和我一样是人文学科专业的学生,没有计算机方面的背景,当你遇到这样的错误时(当然,这是不好的做法) ,你可能会忍不住编辑你的 Windows 注册表,把 ResGen.exe 复制粘贴的到处都是。最好按照上面概述的步骤: 1)直接在 * 上运行 MSBuild.exe。Csproj 文件找出 MSBuild 正在寻找 ResGen.exe 的确切位置,然后2)精确地编辑您的 Windows 注册表,以便 MSBuild 可以找到 ResGen.exe。

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

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

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