【笔记】MSBuild中所有与路径相关的内置属性(宏) MSBuild中所有与路径相关的内置属性宏。这些属性可以分为几大类基本覆盖了从项目、解决方案到输出目录等各个方面。 项目与文件自身路径这些属性用于获取当前项目文件自身的名称、目录和完整路径。宏 (属性)说明示例$(MSBuildProjectDirectory)项目文件所在目录的绝对路径不含末尾反斜杠C:\MyProject\MyApp$(MSBuildProjectDirectoryNoRoot)项目目录路径不包含根驱动器\MyProject\MyApp$(MSBuildProjectFile)项目文件的完整文件名含扩展名MyApp.csproj$(MSBuildProjectName)项目文件的文件名不含扩展名MyApp$(MSBuildProjectExtension)项目文件的扩展名含点号.csproj$(MSBuildProjectFullPath)项目文件的绝对路径和完整文件名C:\MyProject\MyApp\MyApp.csproj$(MSBuildStartupDirectory)调用 MSBuild 命令时所处的目录的绝对路径C:\Source$(MSBuildThisFileFullPath)当前正在执行的.targets或.props文件自身的完整路径C:\Custom\My.targets$(MSBuildThisFileDirectory)当前执行的.targets或.props文件所在的目录含末尾反斜杠C:\Custom\$(MSBuildThisFileName)当前执行的.targets或.props文件的文件名不含扩展名My$(MSBuildThisFileExtension)当前执行的.targets或.props文件的扩展名.targets️ 解决方案相关路径这些属性用于获取解决方案文件的信息。注意它们仅在 Visual Studio IDE 中生成解决方案时有效。宏 (属性)说明示例$(SolutionDir)解决方案的目录含末尾反斜杠C:\MyProject\$(SolutionFileName)解决方案的完整文件名含扩展名MySolution.sln$(SolutionName)解决方案的文件名不含扩展名MySolution$(SolutionExt)解决方案的扩展名.sln$(SolutionPath)解决方案的绝对路径和完整文件名C:\MyProject\MySolution.sln️ 输出与中间目录路径这些属性控制构建过程中文件的存放位置是定制构建流程的核心。宏 (属性)说明示例$(OutDir)最终输出文件的目录路径通常是相对于项目目录的路径含末尾反斜杠bin\Release\$(TargetDir)生成的主输出文件如.dll或.exe所在目录的绝对路径含末尾反斜杠C:\MyProject\bin\Release\$(TargetPath)主输出文件的绝对路径和完整文件名C:\MyProject\bin\Release\MyApp.exe$(TargetFileName)主输出文件的完整文件名MyApp.exe$(TargetName)主输出文件的文件名不含扩展名MyApp$(TargetExt)主输出文件的扩展名.exe$(IntDir)中间文件的目录路径通常是相对于项目目录的路径含末尾反斜杠obj\Release\$(BaseOutputPath)输出文件的基路径OutDir通常基于此生成c:\xyz\bin\$(BaseIntermediateOutputPath)中间输出文件的顶级文件夹obj\$(IntermediateOutputPath)特定配置下的完整中间输出路径obj\Debug\$(PublishDir)发布目标的输出位置默认在OutDir下bin\Release\app.publish\⚙️ 工具链与系统路径这些属性指向 MSBuild 自身、编译器和 .NET 相关文件的路径。宏 (属性)说明示例$(MSBuildBinPath)当前使用的 MSBuild二进制文件所在目录C:\Program Files\dotnet\sdk\7.0.102\$(MSBuildToolsPath)与MSBuildToolsVersion对应的MSBuild 安装路径C:\Program Files\dotnet\sdk\7.0.102\$(MSBuildExtensionsPath)MSBuild 扩展文件夹的路径C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild$(MSBuildExtensionsPath32)32位MSBuild 扩展文件夹路径C:\Program Files (x86)\Microsoft Visual Studio\...$(MSBuildExtensionsPath64)64位MSBuild 扩展文件夹路径C:\Program Files\Microsoft Visual Studio\...$(DevEnvDir)Visual Studio 的安装目录C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\$(VSInstallDir)Visual Studio 安装目录与目标工具集版本相关C:\Program Files\Microsoft Visual Studio\2022\Enterprise\$(VCInstallDir)C 工具集的安装目录C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\$(FrameworkDir).NET Framework 的安装目录C:\Windows\Microsoft.NET\Framework\v4.0.30319\$(FrameworkVersion)Visual Studio 使用的.NET Framework 版本v4.0.30319$(FrameworkSDKDir).NET Framework SDK 的安装目录C:\Program Files\Microsoft SDKs\Windows\v10.0A\ 使用示例与注意事项掌握这些属性后可以更灵活地控制构建过程。以下是一些常见用法和需要注意的细节。1. 路径组合与解析MSBuild 属性可以在任务或属性组中组合使用以构建复杂路径。!-- 示例在自定义目标中引用解决方案目录下的资源 --TargetNameCopyResourcesCopySourceFiles$(SolutionDir)Resources\icon.pngDestinationFolder$(TargetDir)//Target!-- 示例根据项目文件位置推断上级目录 --PropertyGroupRepoRoot$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), .gitignore))/RepoRoot/PropertyGroup2. 条件判断与回退某些属性如解决方案相关属性在非 Visual Studio 构建环境如命令行中可能为空使用时需做条件判断。PropertyGroup!-- 如果 SolutionDir 不存在则回退到项目上级目录 --MyBaseDirCondition$(SolutionDir) ! $(SolutionDir)/MyBaseDirMyBaseDirCondition$(SolutionDir) $([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildProjectDirectory), README.md))\/MyBaseDir/PropertyGroup3. 重要注意事项末尾反斜杠部分目录属性如$(SolutionDir),$(OutDir)默认包含末尾反斜杠而另一些如$(MSBuildProjectDirectory)则不包含。拼接路径时需注意一致性建议使用$([System.IO.Path]::Combine())函数确保跨平台兼容性。环境差异性$(MSBuildExtensionsPath)等工具链路径在不同机器、不同 Visual Studio 版本或 .NET SDK 版本下会有所不同避免在项目文件中硬编码这些路径。设计时与构建时在.targets或.props文件中$(MSBuildThisFileDirectory)非常有用可以确保相对于导入文件本身定位资源不受主项目文件位置影响。4. 常用属性速查表场景推荐属性获取项目根目录$(MSBuildProjectDirectory)获取输出文件路径$(TargetPath)获取中间文件目录$(IntermediateOutputPath)在导入文件中定位资源$(MSBuildThisFileDirectory)判断是否在 Visual Studio 中构建检查$(BuildingInsideVisualStudio)是否为true通过合理运用这些路径属性可以极大地增强项目文件的可维护性和构建流程的可靠性。