我有这个场景,我从AssemblyInfo.cs获得了项目的汇编版本,例如2.0.0,如下所示:
[assembly: AssemblyVersion("2.0.0")]
另外,我想检索这个AssemblyVersion并将其作为web.config中参数的一部分动态设置,例如下面的内容,例如:
<my.config.group>
<version versionNumber="2.0.0" />
</my.config.group>
我需要动态设置上面的版本号作为我的程序集的版本号,以避免在发生变化时手动修改它。
这是必需的,因为我们使用的第三方库如何工作。因此,无法使用替代方法获取程序集版本。我们必须坚持使用web.config。
实现这一目标的最佳解决方案是什么?我正在考虑使用Powershell脚本Post-Build,但是,我在Powershell方面的经验很少,所以我想知道什么是最好的解决方案。
答案 0 :(得分:5)
是的,您可以使用post build事件执行此操作,但您也可以将其作为部署步骤执行此操作。
以下脚本加载程序集,读取版本信息并格式化字符串。然后,它在配置文件上创建版本节点(如果不存在)并设置versionNumber属性:
$assemblyFilePath = "C:\YourAssembly.dll"
$configPath = "C:\YourWeb.config"
# Retrieve the version
$bytes = [System.IO.File]::ReadAllBytes($assemblyFilePath)
$assembly = [System.Reflection.Assembly]::Load($bytes)
$version = $assembly.GetName().Version;
$versionString = [string]::Format("{0}.{1}.{2}",$version.Major, $version.Minor, $version.Build)
$config = [xml](gc $configPath)
$versionNode = $config.SelectSingleNode('configuration//version')
# Ensure the version node is present
if (-not $versionNode)
{
$versionNode = $config.CreateElement('version')
$config.DocumentElement.AppendChild($versionNode)
}
# Set the version number attribute
$versionNode.SetAttribute('versionNumber', $versionString)
$config.Save($configPath)
您还可以阅读并解析AssemblyVersion
中的AssemblyInfo.cs
属性。我之所以喜欢加载程序集本身是因为即使你只有二进制文件也可以使用这个解决方案。
这是一个如何从AssemblyInfo.cs
$assemblyInfoPath = "C:\AssemblyInfo.cs"
$regex = '^\[assembly: AssemblyVersion\("(.*?)"\)\]'
$assemblyInfo = Get-Content $assemblyInfoPath -Raw
$version = [Regex]::Match(
$assemblyInfo,
$regex,
[System.Text.RegularExpressions.RegexOptions]::Multiline
).Groups[1].Value
现在您可以使用[version]::Parse($version)
解析版本,并使用与上面示例相同的格式字符串。