You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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%
    
  • 方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:09:18