启用Windows长路径后仍报ALINK error 1065错误的问题咨询
Windows系统层面的长路径组策略/注册表配置不是全局生效的万能开关,要让单个程序突破260位MAX_PATH限制,必须同时满足两个条件:一是程序本身通过内嵌应用清单显式声明longPathAware = true属性,二是程序内部的文件操作逻辑没有硬编码260位长度校验、正确调用了支持长路径的Win32 API版本。
你之前猜测相关程序未标记长路径感知的方向是正确的,只是定位错了对应的程序主体。VS2019默认调用的.NET Framework版本程序集链接器al.exe(也就是报错信息里的ALINK组件),属于微软官方工具链的一部分,既没有添加长路径感知的清单标记,内部还硬编码了MAX_PATH路径长度校验逻辑,完全没有适配Windows长路径机制,系统层面的开关对这个程序完全不生效,这就是配置已经落地但构建仍然报错的根本原因。
你搜到的Alchemy Software相关说明页面和当前构建流程没有任何关联。Alchemy Software是一家主打软件本地化、多语言翻译工具的厂商,其旗下Alchemy Catalyst产品自带了一个同名的alink.exe工具,同样会抛出AL10xx序列的错误码,因为该页面搜索引擎权重较高,才会在你检索AL1065错误时排在前列。
你当前构建流程中触发报错的ALINK是Visual Studio 2019自带的.NET Framework程序集链接器(Assembly Linker),属于MSBuild原生工具链组件,作用是在构建过程中合并托管模块、嵌入式资源、程序集元数据,最终生成dll/exe主程序集或者多语言卫星附属程序集,只要项目包含嵌入式资源、多模块拆分、本地化资源配置,MSBuild就会自动调用这个组件。你找不到Alchemy相关的dll/exe文件是完全正常的,因为整个构建流程根本没有加载该厂商的任何组件。
以下方案均从工具链兼容层面解决问题,不需要调整项目路径结构:
- 替换为已适配长路径的AL工具版本。.NET Core 3.0、.NET 5及以上版本SDK自带的al.exe(即dotnet al工具)已经完成长路径适配,既添加了longPathAware清单标记,也移除了内部硬编码的路径长度校验。你可以在项目根目录的
Directory.Build.props文件中添加AlToolPath属性,将AL工具的调用路径指向高版本dotnet SDK目录下的al.exe位置(默认路径为C:\Program Files\dotnet\sdk\<对应SDK版本号>\),替换后即可绕过旧版工具的长度限制。 - 给旧版Framework版al.exe手动添加长路径兼容标记。如果必须使用VS2019自带的.NET Framework版本al.exe,可以用VS自带的清单工具mt.exe给对应al.exe嵌入兼容配置:
- 新建名为
al.exe.manifest的清单文件,写入如下配置:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"> <application xmlns="urn:schemas-microsoft-com:asm.v3"> <windowsSettings> <longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware> </windowsSettings> </application> </assembly> - 打开VS开发者命令提示符,定位到al.exe所在目录(VS2019默认路径为
C:\Program Files (x86)\Microsoft SDKs\Windows\<对应Windows SDK版本>\bin\<x86/x64架构>\),执行如下命令嵌入清单:mt.exe -manifest <你保存的al.exe.manifest文件路径> -outputresource:"al.exe";#1
- 新建名为
- 配置MSBuild与Jenkins代理的长路径兼容。给Jenkins构建代理的启动进程(jenkins-agent.exe或对应javaw.exe进程)也添加longPathAware清单标记,避免MSBuild在向AL工具传递路径参数时提前触发长度截断;可以在构建脚本开头执行如下命令,确认长路径注册表配置未被域策略周期性覆盖:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f - 强制MSBuild传递带扩展前缀的路径。可以在
Directory.Build.props中添加配置,强制MSBuild调用AL工具时,所有文件路径都添加\\?\扩展前缀,旧版al.exe即使没有长路径感知标记,只要接收到带该前缀的绝对路径,底层Windows文件API就会自动绕过MAX_PATH限制,不会触发长度校验。
内容的提问来源于stack exchange,提问作者Andrew

