任务失败,因为找不到AL.exe。

14
在编译我的项目时,出现了以下错误:
任务失败是因为找不到“AL.exe”,或者正确的Microsoft Windows SDK未安装。该任务在注册表键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A的InstallationFolder值指定的位置下的“bin”子目录中寻找“AL.exe”。您可以通过以下方式之一解决问题:
1. 安装Microsoft Windows SDK for Windows Server 2008和.NET Framework 3.5。 2. 安装Visual Studio 2008。 3. 手动将上述注册表键设置为正确的位置。 4. 将正确的位置传递到任务的“ToolPath”参数中。
当我向我的 UnitTest 项目文件夹添加资源文件时,就会出现这个错误。这些资源文件并没有直接用于程序的本地化,它们只是普通的文件。我需要它们来单元测试程序内部加载这些资源文件的逻辑,使用了ResXResourceReader。
有人能解释一下为什么会出现这个错误吗?
编辑: 安装Windows SDK解决了这个问题,正如错误所述。但我仍然想知道为什么会出现这个错误,这对我来说没有意义。

我有同样的问题。由于公司的政策,我无法安装Microsoft Windows SDK,甚至不会这样做,因为我有Web应用程序(ASP.NET,C#,MVC框架,i18n),而不是Windows应用程序。此外,我没有访问编辑注册表键的权限。 - meir
8个回答

16
您之所以遇到此错误,是因为您正在构建一个使用程序集清单的3.5项目,但没有安装3.5工具。 (希望有人能提供更多信息。)
我强烈建议安装Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1,并避免使用黑客,特别是当您只需要安装工具时,请务必查看发布说明中的AL.exe信息。(由于安全更新修复,此SDK是3.5的推荐安装。)
SDK的“发布说明”指出,Visual Studio 2005设置了ALTOOLPATH,这可能解释了为什么一些用户无法构建。 这只是我的猜测。
在构建3.5项目时,使用SysInternals的Process Monitor,Visual Studio 2008会在% SystemRoot%\Microsoft.NET\Framework\v3.5文件夹中查找程序集链接器(AL.exe)。 如果未在那里找到AL,则将使用特定v6.0A注册表设置中指定的位置。 (请注意,v6.0A不适用于.NET 3.5。)因此,请安装正确的软件,不要黑客。 :O)
我想知道程序集链接器在2.0、3.0和3.5之间是否不同?

Windows Server 2008和.NET Framework 3.5的Windows SDK

建议安装新发布的Microsoft Windows 7和.NET Framework 3.5 SP1的Windows SDK,而不是安装此版本。如果您在VS2008 SP1之后安装此SDK,请确保应用了Knowledge Base 974479中描述的补丁。有关更多信息,请参阅概述部分。


6

卸载项目,然后编辑你的.csproj文件,你会看到一个导入任务。

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

如果您的项目以 .Net 3.5 为目标,则 MSBuildBinPath = "C:\WINDOWS\Microsoft.NET\Framework\v3.5"。

然后前往:

C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.CSharp.targets 文件

使用记事本打开此文件,搜索 AL 任务,您将得到类似于以下内容:

 <AL AlgorithmId="$(Satellite_AlgorithmId)"
            BaseAddress="$(Satellite_BaseAddress)"
            CompanyName="$(Satellite_CompanyName)"
            Configuration="$(Satellite_Configuration)"
            Copyright="$(Satellite_Copyright)"
            Culture="%(Culture)"
            DelaySign="$(DelaySign)"
            Description="$(Satellite_Description)"
            EmbedResources="@(_SatelliteAssemblyResourceInputs)"
            EvidenceFile="$(Satellite_EvidenceFile)"
            FileVersion="$(Satellite_FileVersion)"
            Flags="$(Satellite_Flags)"
            GenerateFullPaths="$(Satellite_GenerateFullPaths)"
            KeyContainer="$(KeyContainerName)"
            KeyFile="$(KeyOriginatorFile)"
            LinkResources="@(Satellite_LinkResource)"
            MainEntryPoint="$(Satellite_MainEntryPoint)"
            OutputAssembly="$(IntermediateOutputPath)%(Culture)\$(TargetName).resources.dll"
            Platform="$(PlatformTarget)"
            ProductName="$(Satellite_ProductName)"
            ProductVersion="$(Satellite_ProductVersion)"
            ResponseFiles="@(AlResponseFile)"
            SourceModules="@(Satellite_SourceModule)"
            TargetType="$(Satellite_TargetType)"
            TemplateFile="$(IntermediateOutputPath)$(TargetName)$(TargetExt)"
            Title="$(Satellite_Title)"
            ****ToolPath="C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727"****
            Trademark="$(Satellite_Trademark)"
            Version="$(Satellite_Version)"
            Win32Icon="$(Satellite_Win32Icon)"
            Win32Resource="$(Satellite_Win32Resource)">

            <Output TaskParameter="OutputAssembly" ItemName="FileWrites"/>

        </AL>

请注意,我已将ToolPath更改为我机器上存在AL的位置。
默认情况下,它使用$(AlToolPath),不确定此属性的值,但如果您遇到此错误,则肯定没有指向正确位置。
简单来说,AL任务找不到AL.exe,当您编辑并提供ToolPath值时,可以帮助它定位。
希望这解释了为什么会收到此错误消息。

我只想补充一下,未找到AL.exe的路径已写在VS编译器的输出中。因此很容易看到未找到AL.exe的位置。您可以编辑配置或者直接从该路径位置的其他地方复制AL.exe。当然,从最佳实践的角度来看,这并不是很好,但更快且无需编辑配置。 - user1551853

4

无需在构建服务器上安装VS2010。

从您的开发计算机导出“v7.0A”密钥,将其导入构建服务器的注册表中。只需确保根据您运行的Windows服务器版本将任何“Program Files(x86)”重命名为“Program Files”即可。


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.0A - 这是注册表键吗?我的还没有工作,但所有的指向都指向这个键。 - Peter PitLock

2

我和dcadenas做了相同的事情,只是从一台开发机器上复制了SDKs\7.0A文件夹,并将v7.0A注册表设置从开发电脑导出到构建服务器。这样做非常好,因为我不需要在构建服务器上安装VS 2010。谢谢。


2
我遇到了同样的错误,这是由于将资源文件添加到本地文件夹并将构建操作更改为“嵌入式资源”(资源 -> 属性),同时将本地化资源从WebForms修改为MVC3所导致的参见MVC2全球化。确切的错误是由Resources.lang.resx文件名中包含“.”(与“嵌入式资源”相结合)引起的。
之前,当使用“内容”(App_GlobalResources)的全局资源进行编译和运行时,应用程序可以正常工作。
解决方案类似于上面@vicky kole的方法,但由于存在一些差异和先前工作项目中al.exe错误的确切原因,我认为还值得提一下。
经过一些故障排除后,我安装了Windows 7 & ASP.NET 4 SDK,并在C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64文件夹中找到了al.exe。
我随后在 C:\WINDOWS\Microsoft.NET\Framework\*最新版本*\*.targets 中搜索,直到找到与@vicky kole所提到的相同的AL节点。它在另一个名为Microsoft.Common.targets的文件中。我使用了新安装的SDK的路径C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64,并像vicky一样将其放入ToolPath,然后重新启动了Visual Studio。
<AL AlgorithmId="$(Satellite_AlgorithmId)"
ToolPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\x64"

(这可能是对她帖子的评论,因为它与她的情况非常相似)

1
我在Windows 10上构建项目时遇到了类似的错误,其中resgen.exe工具无法找到。 我不得不更改HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v8.0A\WinSDK-NetFX35Tools-x86中的InstallationFolder注册表键,将其更改为实际存在于我的计算机上的路径:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.2 Tools

1

0

我重新安装了Visual Studio后,问题得到了解决。


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