【问题标题】:Put Assembly Version from AssemblyInfo.cs in Web.config将 AssemblyInfo.cs 中的程序集版本放入 Web.config
【发布时间】:2015-08-11 09:35:58
【问题描述】:

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

【问题讨论】:

  • 您要解决什么问题?为什么(某些代码)需要从 web.config 中读取它,而它可以(可能)直接访问程序集版本信息?
  • @Damien_The_Unbeliever web.config 参数提及被第三方库使用,所以这是我无法控制的,我需要做的是找到一种方法来获取程序集版本并添加它在 versionNumber="" 参数中。

标签: .net powershell web-config


【解决方案1】:

是的,您可以使用构建后事件来执行此操作,但您也可以将其作为部署步骤或其他方式来执行。

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

【讨论】:

  • 这看起来和我所追求的完全一样,我要做的唯一改变是我将从 AssemblyInfo 加载它,因为在我的情况下它总是可用的
  • 我添加了一个示例,您可以如何从 AssemblyInfo.cs 中读取版本
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2010-11-01
  • 2012-11-14
  • 1970-01-01
相关资源
最近更新 更多