首页 > 解决方案 > 如何以编程方式将 AssemblyInfo.cs 更新为预构建事件 (Visual Studio / msbuild)

问题描述

我希望在我的项目中定义一个位置来存储版本字符串。我正在寻找的行为是将版本存储在项目目录中的文本文件 (version.txt) 中,然后我的预构建事件更新 Properties/AssemblyInfo.cs 中的内容。

[assembly: AssemblyVersion("<Version>")]
[assembly: AssemblyFileVersion("<Version>")]

是的,我知道只有两个字段并且它们彼此相邻,但我仍然想知道这是否可能。

我编写并测试了执行此功能的 Powershell 脚本。

$assemblyInfoPath = "Properties\AssemblyInfo.cs"
$versionText = (Get-Content -Path version.txt -ReadCount 0)
$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0)
$assemblyInfoText = $assemblyInfoText -replace '\[assembly: AssemblyVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyVersion(`"$versionText`")]"
$assemblyInfoText -replace '\[assembly: AssemblyFileVersion\("((\d)+|(\.))*"\)\]', "[assembly: AssemblyFileVersion(`"$versionText`")]" | Set-Content -Path $assemblyInfoPath

失败的(我认为)是预构建步骤中的调用:

预构建事件命令行:

powershell $(ProjectDir)set_assembly_version.ps1

我没有尝试使用 msbuild 运行它,仅通过 Visual Studio 2017。这是否可能,因为 AssemblyInfo.cs 是一个项目文件?

标签: c#visual-studiomsbuild.net-assemblyassemblyinfo

解决方案


我试图做同样的事情,但发现我的系统没有配置为允许我通过这样的命令执行 powershell 脚本。我本可以解决这个问题,但不是要求每个人都对他们的机器进行相同的编辑,我想我会构建一个不需要执行外部脚本文件的完整预构建命令。主要的“挑战”是确保我已经正确地逃脱了一切。

由于我的项目的性质,我的版本有很多变化。我试图准确地重新创建您在命令中尝试执行的操作,您应该能够将其插入到您的预构建事件中:

powershell $assemblyInfoPath = \"$(projectDir)Properties\AssemblyInfo.cs\";$versionText = (Get-Content -Path \"$(projectDir)version.txt\" -ReadCount 0);$assemblyInfoText = (Get-Content -Path $assemblyInfoPath -ReadCount 0);$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyVersion\(".*"\)\]$\", \"[assembly: AssemblyVersion(`\"$versionText`\")]\";$assemblyInfoText = $assemblyInfoText -replace \"^\[assembly: AssemblyFileVersion\(".*"\)\]$\", \"[assembly: AssemblyFileVersion(`\"$versionText`\")]\";Set-Content -Path $assemblyInfoPath -Value $assemblyInfoText;

推荐阅读