如何在MSBuild中获取项目版本以传递给.bat文件?
一、获取项目版本并传递给.bat文件
MSBuild内置了直接读取版本信息的属性,你可以轻松把版本作为参数传给外部批处理脚本,主要有两种方式:
1. 直接使用内置版本属性
如果你的项目是传统非SDK风格(比如.NET Framework),MSBuild会自动读取AssemblyInfo.cs里的AssemblyVersion、AssemblyFileVersion等属性,直接在构建脚本里用$(AssemblyVersion)、$(FileVersion)就能拿到版本字符串。
如果是SDK风格项目(.NET Core/5+),不管是自动生成AssemblyInfo还是手动维护,$(Version)、$(AssemblyVersion)这些属性也都能直接用。
你只需要在项目文件(.csproj/.vbproj)里添加一个后构建任务,调用你的bat脚本并传入版本参数:
<Target Name="RunCustomPackaging" AfterTargets="PostBuildEvent"> <!-- 把版本作为参数传给bat,注意引号处理空格问题 --> <Exec Command=""$(SolutionDir)path-to-your-script.bat" "$(AssemblyVersion)"" /> </Target>
2. 自定义提取AssemblyInfo.cs的版本(更灵活)
如果你需要对版本做额外处理,或者项目结构特殊,可以手动读取AssemblyInfo.cs并提取版本:
<Target Name="ExtractAssemblyVersion" BeforeTargets="PostBuildEvent"> <!-- 读取AssemblyInfo.cs的所有行 --> <ReadLinesFromFile File="Properties\AssemblyInfo.cs"> <Output TaskParameter="Lines" ItemName="AssemblyInfoLines" /> </ReadLinesFromFile> <!-- 用正则匹配AssemblyVersion属性 --> <RegexMatch Input="@(AssemblyInfoLines)" Expression='\[assembly: AssemblyVersion\("([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"\)\]'> <Output TaskParameter="Matches" ItemName="VersionMatches" /> </RegexMatch> <!-- 把提取到的版本存为属性 --> <PropertyGroup> <ProjectVersion>%(VersionMatches.Value)</ProjectVersion> </PropertyGroup> </Target> <Target Name="ExecutePackagingScript" AfterTargets="ExtractAssemblyVersion"> <!-- 传递自定义提取的版本给bat --> <Exec Command=""$(SolutionDir)path-to-your-script.bat" "$(ProjectVersion)"" /> </Target>
二、将AssemblyInfo.cs的版本引入构建流程
不同类型的项目处理方式略有区别,但核心都是让MSBuild识别并读取版本信息:
1. 传统非SDK项目(.NET Framework)
这类项目默认就有Properties\AssemblyInfo.cs文件,里面的版本属性(比如[assembly: AssemblyVersion("1.0.0.0")])会被MSBuild自动读取,你不需要额外配置,直接在构建脚本里用$(AssemblyVersion)、$(AssemblyFileVersion)这些属性即可。
2. SDK风格项目(.NET Core/5+)
默认情况下,SDK项目会自动生成临时的AssemblyInfo文件,版本信息可以直接在项目文件里配置:
<PropertyGroup> <!-- 主版本号 --> <Version>1.2.3.4</Version> <!-- 程序集版本(可以和Version不同) --> <AssemblyVersion>1.2.0.0</AssemblyVersion> <!-- 文件版本 --> <FileVersion>1.2.3.4</FileVersion> </PropertyGroup>
如果你想手动维护自己的AssemblyInfo.cs,只需要禁用自动生成功能:
<PropertyGroup> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> </PropertyGroup>
然后手动添加AssemblyInfo.cs文件并写入版本属性,MSBuild依然会自动读取这些值到构建流程中。
不管哪种项目,这些版本属性都能在构建的任意阶段使用——不管是预构建检查、后构建打包,还是传递给外部工具。
内容的提问来源于stack exchange,提问作者Christopher Pisz




