MSBuild 命令和属性的宏
根据Visual Studio的安装选项,Visual Studio 可以在基于 MSBuild
的 .vcxproj
Visual Studio 项目中提供数百个宏。
这些宏对应于 MSBuild
属性,它们要么是默认设置的,要么是在 .props
或 .targets
文件中,或者在项目设置中设置的。
这些宏可以帮助我们对项目进行一些增强性的配置。
例如在一个C++项目中,我们可以看到如下配置,这里就是使用了宏

它最后的路径是动态计算出来的

我们可以在项目"属性页"
对话框中接受字符串的任意位置使用这些宏。 这些宏不区分大小写。
我们也可以点击【宏】
按钮,来查看所有预计算的宏

什么时候使用这些宏定义
举个简单的例子来说,假设我现在创建一个C#解决方案,里面有两个项目A和B。
如果我想把B的输出路径配置到A的输出路径下:
1、如果我们使用绝对路径,那项目在移动位置时,将会导致输出路径错误
2、如果我们使用相对路径,那不可避免要向上级寻找目录,可能就会出现../../../xxx/bin/Debug这样的路径。可读性就会降低
如果我们使用MSBuild
的宏
,就可以写成如下路径
1 $(SolutionDir)A\bin\Debug\
这样不管项目路径如何改变,都可以自动计算出相应的位置。
这只是一个简单的举例,具体还需要根据项目实际场景去使用这些宏定义。
另外还需要注意的:在C#项目属性中,我们无法在界面上看到这些宏定义,但是仍然可以使用它们。
例如在一个.NET 8的WPF工程中,我们可以将当前项目输出到同一个解决方案下WpfApp17的输出路径

常见宏列表
宏 | 说明 |
---|---|
$(Configuration) |
当前项目配置的名称,例如,"调试"。 |
$(DevEnvDir) |
Visual Studio 的安装目录(定义为驱动器 + 路径);包括尾随反斜杠 (\)。 |
$(FrameworkDir) |
在其中安装了 .NET Framework 的目录。 |
$(FrameworkSDKDir) |
在其中安装了 .NET Framework 的目录。 .NET Framework 可能已作为 Visual Studio 的一部分安装或已单独安装。 |
$(FrameworkVersion) |
Visual Studio 使用的.NET framework 版本。 结合 $(FrameworkDir) ,就是 Visual Studio 使用的 .NET Framework 版本的完整路径。 |
$(FxCopDir) |
fxcop.cmd 文件的路径。 fxcop.cmd 文件并未在所有 Visual Studio 版本中安装。 |
$(IntDir) |
为中间文件指定的目录路径。 如果这是一个相对路径,中间文件将转到已追加到项目目录的这一路径。 此路径应包含尾随斜杠 (\)。 它解析为"中间目录"属性的值。 请勿使用 $(OutDir) 来定义此属性。 |
$(OutDir) |
输出文件目录的路径。 如果这是一个相对路径,输出文件将转到已追加到项目目录中的这一路径。 此路径应包含尾随斜杠 (\)。 它解析为"输出目录"属性的值。 请勿使用 $(IntDir) 来定义此属性。 |
$(Platform) |
当前项目平台的名称(例如"Win32")。 |
$(PlatformShortName) |
当前体系结构的短名称,例如"x86"或"x64"。 |
$(ProjectDir) |
项目的目录(定义为驱动器 + 路径);包括尾随反斜杠 (\)。 |
$(ProjectExt) |
项目的文件扩展名。 文件扩展名之前包括"."。 |
$(ProjectFileName) |
项目的文件名称(定义为基名称 + 文件扩展名)。 |
$(ProjectName) |
项目的基名称。 |
$(ProjectPath) |
项目的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。 |
$(PublishDir) |
发布目标的输出位置;包括尾随反斜杠 (\)。 默认为 $(OutDir)app.publish\ 文件夹。 |
$(RemoteMachine) |
设置为"调试"属性页上 Remote Machine 属性的值。 有关详细信息,请参阅更改 C/C++ 调试配置的项目设置。 |
$(RootNameSpace) |
包含应用程序的命名空间(如果存在)。 |
$(SolutionDir) |
解决方案的目录(定义为驱动器 + 路径);包括尾随反斜杠 (\)。 仅当在 IDE 中生成解决方案时定义。 |
$(SolutionExt) |
解决方案的文件扩展名。 文件扩展名之前包括"."。 仅当在 IDE 中生成解决方案时定义。 |
$(SolutionFileName) |
解决方案的文件名称(定义为基名称 + 文件扩展名)。 仅当在 IDE 中生成解决方案时定义。 |
$(SolutionName) |
解决方案的基名称。 仅当在 IDE 中生成解决方案时定义。 |
$(SolutionPath) |
解决方案的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。 仅当在 IDE 中生成解决方案时定义。 |
$(TargetDir) |
生成的主输出文件的目录(定义为驱动器 + 路径);包括尾随反斜杠 (\)。 |
$(TargetExt) |
生成的主输出文件的文件扩展名。 文件扩展名之前包括"."。 |
$(TargetFileName) |
生成的主输出文件的文件名称(定义为基名称 + 文件扩展名)。 |
$(TargetName) |
生成的主输出文件的基名称。 |
$(TargetPath) |
生成的主输出文件的绝对路径名称(定义为驱动器 + 路径 + 基名称 + 文件扩展名)。 |
$(VCInstallDir) |
包含 Visual Studio 安装的 C++ 内容的目录。 此属性包含目标 Microsoft C++ (MSVC) 工具集的版本,它可能与主机 Visual Studio 不同。 例如,当使用 $(PlatformToolset) = v140 进行生成时,$(VCInstallDir) 包含 Visual Studio 2015 安装路径。 |
$(VSInstallDir) |
在其中安装了 Visual Studio 的目录。 此属性包含目标 Visual Studio 工具集的版本,它可能与主机 Visual Studio 不同。 例如,当使用 $(PlatformToolset) = v110 进行生成时,$(VSInstallDir) 包含 Visual Studio 2012 安装路径。 |
$(WebDeployPath) |
从 Web 部署根到项目输出位置的相对路径。 |
$(WebDeployRoot) |
<localhost> 位置的绝对路径。 例如 c:\inetpub\wwwroot 。 |