将 AssemblyInfo.cs 中的程序集版本放入 Web.config

Put Assembly Version from AssemblyInfo.cs in Web.config

我有这种情况,我有来自 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 的经验很少,所以我想知道什么是最好的解决方案。

是的,您可以使用 post 构建事件来完成此操作,但您也可以将其作为部署步骤或其他任何方式来完成。

以下脚本加载程序集,读取版本信息并设置字符串格式。然后,如果不存在,它会在配置文件上创建版本节点并设置 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)

您还可以从 AssemblyInfo.cs 中读取和解析 AssemblyVersion 属性。我更喜欢加载程序集本身的原因是因为即使您只有二进制文件也可以使用此解决方案。

这是一个示例,您可以如何从 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) 解析版本并使用与上述示例相同的格式字符串。