Delphi 11 如何编程获取MSBuild对应的正确ToolsVersion
正确获取Delphi匹配MSBuild ToolsVersion的方法
不要硬编码版本号,也不要扫描系统安装的最高.NET版本,Delphi的构建依赖版本是和IDE发行版强绑定的,有两个零硬编码的可靠方案:
方案1:从注册表读取IDE实际使用的版本值(适配自定义脚本场景)
Delphi安装时会把构建环节用的ToolsVersion写入注册表,路径和IDE内部版本号对应:- 32位系统全局安装:
HKLM\Software\Embarcadero\BDS\<IDE内部版本号>\MSBuild - 64位系统全局安装:
HKLM\Software\Wow6432Node\Embarcadero\BDS\<IDE内部版本号>\MSBuild - 当前用户安装:
HKCU\Software\Embarcadero\BDS\<IDE内部版本号>\MSBuild
项下的ToolsVersion字符串值,就是IDE点击构建按钮时实际传递的参数,和CodeGear.Common.Targets的要求完全一致。
批处理里直接加一段读取逻辑即可,后续升级Delphi只需要改一次IDE内部版本号(比如10.4是21.0,11.x是22.0,12.x是23.0):
@echo off set "BDS_VER=22.0" set "MSBUILD_TV=" :: 依次从三个可能的注册表路径读值 for /f "tokens=2* skip=2" %%a in ('reg query "HKCU\Software\Embarcadero\BDS\%BDS_VER%\MSBuild" /v ToolsVersion 2^>nul') do set "MSBUILD_TV=%%b" if not defined MSBUILD_TV for /f "tokens=2* skip=2" %%a in ('reg query "HKLM\Software\Embarcadero\BDS\%BDS_VER%\MSBuild" /v ToolsVersion 2^>nul') do set "MSBUILD_TV=%%b" if not defined MSBUILD_TV for /f "tokens=2* skip=2" %%a in ('reg query "HKLM\Software\Wow6432Node\Embarcadero\BDS\%BDS_VER%\MSBuild" /v ToolsVersion 2^>nul') do set "MSBUILD_TV=%%b" :: 加载环境变量后执行构建 call "C:\Program Files (x86)\Embarcadero\Studio\%BDS_VER%\bin\rsvars.bat" msbuild someproject.dproj /v:q /p:Platform=Android /t:Build;Deploy /p:Config=Release /p:BT_BuildType=AppStore /toolsversion:%MSBUILD_TV%- 32位系统全局安装:
方案2:直接用Delphi自带的封装脚本(最省心,零版本配置)
你之前只调用了rsvars.bat,但同目录下还有个Delphi官方封装的msbuild.bat,这个脚本内部已经处理好了MSBuild路径、ToolsVersion、目标文件加载顺序所有配置,和IDE内部构建的参数完全一致,根本不需要自己加/toolsversion参数,也不用管环境变量优先级问题:@echo off set "BDS_PATH=C:\Program Files (x86)\Embarcadero\Studio\22.0" call "%BDS_PATH%\bin\rsvars.bat" call "%BDS_PATH%\bin\msbuild.bat" someproject.dproj /v:q /p:Platform=Android /t:Build;Deploy /p:Config=Release /p:BT_BuildType=AppStore
你之前遇到的XmlPeek任务找不到的报错,本质是调用rsvars.bat后,系统还是优先找到了.NET 2.0目录下的旧版MSBuild.exe,这个版本的任务库根本没有XmlPeek,加/toolsversion:4.0是强制让它用.NET4的MSBuild任务库,而用官方封装的msbuild.bat会直接定位到正确版本的MSBuild可执行文件,从根源上避免这个问题。
内容的提问来源于stack exchange,提问作者TomB
相关产品推荐
相关产品推荐

