2015-08-11 2 views
3

У меня есть этот сценарий, где у меня есть версия сборки проекта из AssemblyInfo.cs, например 2.0.0, как показано ниже:Помещенный версия сборки от AssemblyInfo.cs в Web.config

[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

Какая проблема вы пытаетесь решить? Почему (какой-то фрагмент кода) требуется, в частности, прочитать это из web.config, когда он (предположительно) может напрямую получить доступ к информации о версии сборки? –

+0

@Damien_The_Unbeliever упоминание параметра web.config используется сторонней библиотекой, поэтому это не входит в мой контроль, то, что мне нужно сделать с моего конца, это найти способ получить версию сборки и добавить ее в версию versionNumber = "" параметр. –

ответ

5

Да, вы могли бы сделать это с помощью события post 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) 

Вы также можете прочитать и разобрать атрибут 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) и использовать ту же строку формата, как в примере выше.

+0

это выглядит точно так же, как и я, единственное изменение, которое я сделаю, это то, что я загружу его из AssemblyInfo, так как это всегда будет доступно в моем случае –

+0

Я добавил пример, как вы можете прочитать версию из AssemblyInfo. CS –

Смежные вопросы