Winapi CI服务器上的MSBuild可以';找不到AL.exe

Winapi CI服务器上的MSBuild可以';找不到AL.exe,winapi,.net-4.0,msbuild,teamcity,Winapi,.net 4.0,Msbuild,Teamcity,我的TeamCity CI build服务器出现问题,在编译过程中出现以下错误: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2342,9):错误MSB3086:任务无法使用SdkToolsPath“”或注册表项“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft SDKs\WINDOWS\v7.0A”找到“AL.exe”。确保已设置SdkToolsPath,并且该工

我的TeamCity CI build服务器出现问题,在编译过程中出现以下错误:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(2342,9):错误MSB3086:任务无法使用SdkToolsPath“”或注册表项“HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft SDKs\WINDOWS\v7.0A”找到“AL.exe”。确保已设置SdkToolsPath,并且该工具位于SdkToolsPath下的正确处理器特定位置,并且已安装Microsoft Windows SDK

例如,一年前人们升级到.NET3.5时,我发现了类似的报告。在这种情况下,安装最新的SDK解决了这个问题,但是我已经在构建服务器上安装了最新的SDK()。MSBuild工具都位于服务器上名为

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319

并且AL.exe存在于

C:\Program Files\Microsoft SDK\Windows\v7.1\Bin\NETFX 4.0工具


但是,错误消息中提到的注册表项不存在。因此,MSBuild的安装/配置似乎有问题。此错误仅发生在具有嵌入式资源的项目中,这些项目需要AL.exe。

我们最近在尝试运行.Net 4.0版本时遇到此问题。我们发现al.exe的位置在.Net 4.0附带的原始MSBuild与.Net 4.0的Visual Studio SDK(稍后发布)之间发生了更改

由于唯一可用的SDK工具的独立安装是我们已经安装但未成功的(您提到的那个),因此我们能想到的唯一解决方案是在构建代理上安装Visual Studio。我们将VisualStudio2010Express(为了使安装尽可能轻量级)放在那里,问题就解决了。这不是一个很好的解决方案,但它确实起到了作用——安装VS2010还将安装MSBuild所寻找的特定版本的SDK工具


这是一个确实不应该发生的问题,但似乎没有一种方法可以让MSBuild在正确的位置查找工具,甚至在注册表中进行黑客攻击。

我有一个简单有效的修复方法

问题似乎在于Visual Studio附带的工具版本是7.0A版本,而Windows SDK附带的版本是7.1版本。这一切都很好,但MSBuild.exe仍在寻找7.0A版本的注册表项,而这些注册表项并不存在。这一定是个虫子

查看我的注册表,V6.0和V7.1的所有信息都是正确的。所以我的解决方案很简单。我创建了一个注册表链接,用于生成7.1键的别名

无法使用内置工具创建注册表链接,因此我从中下载了一个名为“regln”的小实用程序

C:>regln-x86.exe“\Registry\Machine\SOFTWARE\Microsoft\Microsoft-SDKs\Windows\v7.0A”“\Registry \机器\SOFTWARE\Microsoft\Microsoft SDK\Windows\v7.1“


工作完成了。MSBuild现在可以在TeamCity服务器上完美运行。

因为您已经安装了最新的SDK(我假设它是v7.1)

  • 从“开始”菜单转到“Microsoft Windows SDK v7.1”
  • 选择“Windows SDK 7.1命令提示符”并输入
  • cd设置

  • WindowsSdkVer-版本:v7.1


  • 这将告诉msbuild使用该版本的工具,而无需进行任何可怕的注册表编辑。

    您还需要应用以下注册表修复程序来更新msbuild以指向V7.1 sdk值

    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0]
    "MSBuildToolsPath"="C:\\WINDOWS\\Microsoft.NET\\Framework\\v4.0.30319\\"
    "MSBuildToolsRoot"="C:\\WINDOWS\\Microsoft.NET\\Framework\\"
    "FrameworkSDKRoot"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1@InstallationFolder)"
    "MSBuildRuntimeVersion"="4.0.30319"
    "SDK40ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1\\WinSDK-NetFx40Tools-x86@InstallationFolder)"
    "SDK35ToolsPath"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1\\WinSDKNetFx35Tools@InstallationFolder)"
    "MSBuildToolsPath32"="$(Registry:HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSBuild\\ToolsVersions\\4.0@MSBuildToolsPath)"
    

    我也有同样的问题,这里是我的简单答案

    在TeamCity服务器上安装Microsoft Windows SDK 7.1后

    在Regedit中更改此键

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\4.0\SDK40ToolsPath
    


    在Windows 10上设置新生成服务器时遇到相同问题。
    找到并安装了最新版本(当时),解决了问题。

    尽管问题已经很老了,但它仍然出现在谷歌搜索结果的顶部,因此我决定也发布我的解决方案。在Windows Server 2016和Windows 10 Pro上安装TeamCity时,我也遇到了同样的问题

    我已安装和(仅适用于.NET4.6.2的工具),并从问题中得到错误

    缺少的难题是设置环境变量:
    targetFrameworkDKToolsDirectory=C:\ProgramFiles(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.2 Tools

    设置环境变量后,MSBuild能够解析所有需要的工具,包括AL.exe和生成成功


    请告诉我是否可以通过在注册表中设置值来实现同样的效果,但是在这种情况下,环境变量也可以很好地工作,并且不需要安装VS。

    添加系统环境变量
    targetFrameworkDKTools目录

    像这样:

    targetFrameworkSDK工具目录=C:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.2工具


    按照以下步骤重新启动VS。这对我来说非常有效。节省了我的时间

    1-右键单击我的电脑图标并选择属性,或在Windows控制面板中选择系统

    2-选择高级系统设置

    3-在“高级”选项卡上,单击“环境变量”

    4-单击“新建”以在“用户变量”部分下创建新的环境变量

    5-变量名称:targetFrameworkDKToolsDirectory

    6-变量值:targetFrameworkDKToolsDirectory=C:\ProgramFiles(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.2工具

    变量值取决于SDK安装路径。

    7-单击确定和保存所有窗口

    8-重新启动Visual Studio。

    $(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1\WinSDK-NetFx40Tools-x86@InstallationFolder)