Как программно изменить версию продукта проекта?

Вот моя проблема:

У меня есть несколько проектов развертывания. Для развертывания приложения я должен сделать несколько задач, один из них должен изменить каждую версию продукта проекта развертывания и код продукта.

Я не могу найти способ программно изменить их.

Кто-либо может помочь мне?

Заранее спасибо.

ОБНОВЛЕНИЕ: Так как это - проект Развертывания (который наконец производит исполняемый установщик), я не в состоянии работать с MSBuild, вместо этого я использую Devenv от командной строки. (Bruno, спасибо за Ваш быстрый ответ).

11
задан Cœur 14 November 2019 в 03:49
поделиться

10 ответов

Сегодня я искал ту же самую вещь. Я нашел это использование Google:

static void Main(string[] args) 
{
    string setupFileName = @"<Replace the path to vdproj file>"; 
    StreamReader reader = File.OpenText(setupFileName); 
    string file = string.Empty; 

    try 
    { 
        Regex expression = new Regex(@"(?:\""ProductCode\"" = 
        \""8.){([\d\w-]+)}"); 
        Regex expression1 = new Regex(@"(?:\""UpgradeCode\"" = 
        \""8.){([\d\w-]+)}"); 
        file = reader.ReadToEnd(); 

        file = expression.Replace(file, "\"ProductCode\" = \"8:{" + 
        Guid.NewGuid().ToString().ToUpper() + "}"); 
        file = expression1.Replace(file, "\"UpgradeCode\" = \"8:{" 
        + Guid.NewGuid().ToString().ToUpper() + "}"); 
    } 
    finally 
    { 
        // Close the file otherwise the compile may not work 
        reader.Close(); 
    } 

    TextWriter tw = new StreamWriter(setupFileName); 
    try 
    { 
        tw.Write(file); 
    } 
    finally 
    { 
        // close the stream 
        tw.Close(); 
    } 
 }
10
ответ дан 3 December 2019 в 08:06
поделиться

Я знаю, что исходный плакат ищет.NET 2,0 решения этой проблемы. Однако, так как это не было отмечено как.NET, я предложу свое решение C++ проблемы. Это может быть применимо на земле.NET, но я оставлю это другим.

Это не только обновляет информацию о версии в о поле и файле журнала для моего приложения, но также и всей информации о версии Windows, которая замечена в Windows Explorer.

ОБНОВЛЕНИЕ: Добавленный некоторые изменения, которые я внес в процесс начиная со своего исходного ответа.

Прежде всего я переместил весь блок информации о версии от своего файла Project.rc до моего файла Проекта rc2:

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION FILE_VER
 PRODUCTVERSION PROD_VER
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
  FILEFLAGS 0x1L
#else
  FILEFLAGS 0x0L
#endif
  FILEOS 0x4L
  FILETYPE 0x1L
  FILESUBTYPE 0x0L
BEGIN
   BLOCK "StringFileInfo"
   BEGIN
       BLOCK "040904e4"
       BEGIN
           VALUE "CompanyName", "MyCompany"
           VALUE "FileDescription", "Software Description"
           VALUE "FileVersion", 1,0,0,1
           VALUE "InternalName", "FileName.exe"
           VALUE "LegalCopyright", "(c) 2008 My Company.  All rights reserved."
           VALUE "OriginalFilename", "FileName.exe"
           VALUE "ProductName", "Product Name"
           VALUE "ProductVersion", 1,0,0,1
       END
   END
   BLOCK "VarFileInfo"
   BEGIN
       VALUE "Translation", 0x409, 1252
   END
END

Это по существу транспортирует весь материал информации о версии, который Вы отредактировали бы от редактора ресурса в отдельный файл. Это делает его так, чтобы Вы не получали ошибки при редактировании файла ресурсов от за пределами редактора. Оборотная сторона - то, что Вы больше не можете редактировать информацию о версии от редактора ресурса. Но, так как мы хотим этот материал, обновленный автоматически, который не является грандиозным предприятием.

Затем, я создал файл VersionInfo.h и добавил его к моему проекту:

#pragma once

//major release version of the program, increment only when major changes are made
#define VER_MAJOR 2

//minor release version of the program, increment if any new features are added
#define VER_MINOR 0

//any bugfix updates, no new features
#define VER_REV 0

//if this is some special release (e.g. Alpha 1) put the special release string here
#define STR_SPECIAL_REL "Alpha 1"


#define FILE_VER VER_MAJOR,VER_MINOR,VER_REV
#define PROD_VER FILE_VER

//these are special macros that convert numerical version tokens into string tokens
//we can't use actual int and string types because they won't work in the RC files
#define STRINGIZE2(x) #x
#define STRINGIZE(x) STRINGIZE2(x)

#define STR_FILE_VER STRINGIZE(VER_MAJOR) "." STRINGIZE(VER_MINOR) "." STRINGIZE(VER_REV)
#define STR_PROD_VER STR_FILE_VER " " STR_SPECIAL_REL

#define STR_COPYRIGHT_INFO "©" BuildYear " Your Company. All rights reserved."

Я затем включал VersionInfo.h в rc2 файл и внес следующие изменения:

#include "VersionInfo.h"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//

<no changes>
           VALUE "FileVersion", STR_FILE_VER
           <no changes>
           VALUE "LegalCopyright", STR_COPYRIGHT_INFO
           <no changes>
           VALUE "ProductVersion", STR_PROD_VER
<no changes>

С этой установкой я мог отредактировать свой сценарий сборки (который использует Perl) изменить информацию о версии в файле VersionInfo.h прежде, чем восстановить весь проект с помощью devenv командной строки.

Один дополнительный шаг, что я добавил это, может также представлять интерес (хотя он еще не полностью усовершенствован и может быть будущим вопросом здесь), должен генерировать уникальный номер сборки каждый раз, когда проект разрабатывается. В текущем воплощении это всегда работает на полный, восстанавливает, но только эпизодически на возрастающих сборках. То, что я сделал, было, создают файл, названный build_number.incl, который содержит следующее:

#define CurrentBuildNumber  "20081020P1525" 

Который является по существу датой и временем, что сборка была запущена. Я создал пакетный файл, который выполняется как событие перед сборкой к проекту, который генерирует этот файл. Сценарий также определяет BuildYear так, чтобы авторское право в файле VersionInfo.h всегда содержало год новой сборки. Сценарий пакетной обработки следующий:

    echo Generating Build Number
    @For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @(
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
    )

    @For /F "tokens=1,2,3 delims=/M: " %%A in ('Time /t') do @(
    Set Hour=%%A
    Set Minute=%%B
    Set AmPm=%%C
    )

    @echo #define CurrentBuildNumber  "%Year%%Month%%Day%%AmPm%%Hour%%Minute%" > "$(ProjectDir)\build_number.incl"
    @echo #define BuildYear "%Year%" >> "$(ProjectDir)\build_number.incl"
    echo ----------------------------------------------------------------------

Этот файл затем включен в любой файл в проекте, который должен использовать номер сборки (т.е. о поле).

Часть этого подбиралась из этого сообщения CodeProject.

Надо надеяться, эта информация оказывается полезной.

5
ответ дан 3 December 2019 в 08:06
поделиться

У меня была та же проблема, и я узнал то изменение .vdproj файл в a prebuildevent точно не делает то, что я люблю.

Я использовал некоторый другой код изменить msi файл файла после проект установки был сборкой, таким образом, я использую postbuildevent.

Посмотрите мое сообщение в блоге здесь.

2
ответ дан 3 December 2019 в 08:06
поделиться

Мы используем программу, которая обновляет каждый AssemblyInfo.cs или AssemblyInfo.vb на основе значения конфигурационного файла. мы выполняем этот исполняемый файл перед каждой сборкой. Это было лучшим, мы могли сделать для автоматизации этого процесса. Можно добавить вызов к этой пакетной обработке в конфигурации проектов как пред шаг сборки.

1
ответ дан 3 December 2019 в 08:06
поделиться

Вы могли использовать msbuild задачу обновить Вас версия продукта. Проверьте это сообщение от команды MSBuild на этом предмете.

0
ответ дан 3 December 2019 в 08:06
поделиться

Встраивание числа Пересмотра SVN во время компиляции в Приложении Windows

В моем ответе на этот вопрос я описываю, как я выполняю эту задачу с помощью SVN.

0
ответ дан 3 December 2019 в 08:06
поделиться

Это не может быть вполне, что Вы после, но путь назад в туманах времени, которое я записал чему-то названному stampver, который может автоинкремент номер сборки непосредственно в .exe файле как шаг постсборки.

0
ответ дан 3 December 2019 в 08:06
поделиться

Консоль тюнера ресурса

Этот консольный редактор ресурса позволяет создавать надежный и повторяемый процесс для обновления Информационных ресурсов Версии продукта во время заключительного этапа процесса сборки от командной строки.

Посмотрите конкретно пакетное управление страницы информации о версии файла для больших деталей:

0
ответ дан 3 December 2019 в 08:06
поделиться

Изучите использование RCS, CVS и/или подверсии. Я только знаком с RCS; мое понимание - то, что CVS основан на RCS, но более всесторонний. Я читал на различных платах, что подверсия лучше, но я никогда не использовал ее. RCS был достаточен для отслеживания изменения и версии на всех моих документах и проектах программного обеспечения.

RCS здесь: http://www.cs.purdue.edu/homes/trinkle/RCS/

CVS здесь: http://www.nongnu.org/cvs/

Подверсия здесь: http://subversion.tigris.org/

-3
ответ дан 3 December 2019 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: