2008-11-20 112 views
10

这是我的问题:如何以编程方式更改项目的产品版本?

我有几个部署项目。为了部署应用程序,我需要完成几项任务,其中一项任务是更改每个部署项目的产品版本和产品代码。

我找不到以编程方式更改它们的方法。

任何人都可以帮助我吗?

在此先感谢。

更新:由于它是一个部署项目(它最终生成一个可执行安装程序),我无法使用MSBuild,而是从命令提示符使用Devenv。 (布鲁诺,感谢您的快速回复)。

+0

这是什么类型的项目? C++或c#/ vb? – 2008-11-20 18:16:58

+0

该项目是一个C#部署项目,我使用.Net 2.0。 – 2008-11-20 18:28:23

+0

有完整源代码的最终解决方案?是vdproj项目? – Kiquenet 2012-08-14 17:33:30

回答

10

我今天正在寻找完全相同的东西。我发现这使用谷歌:

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(); 
    } 
} 
0

您可以使用msbuild任务来更新产品版本。在此主题上查看MSBuild团队的this post

+0

现在在哪里(2012)AssemblyInfoTask? – Kiquenet 2012-08-17 06:45:17

1

我们使用的程序根据配置文件值更新每个AssemblyInfo.cs或AssemblyInfo.vb。我们在每次构建之前运行此可执行文件这是我们可以做的最好的自动化过程。您可以在项目配置中将此调用添加到此批处理作为预生成步骤。

+0

这可以包含在使用前提条件的构建过程中。 – 2011-08-05 13:30:40

0

这可能不完全是你所追求的,但回到时间的迷雾中,我写了一个名为stampver的东西,它可以在构建后步骤中直接在.exe文件中自动递增内部版本号。

5

我知道原来的海报正在寻找这个问题的.NET 2.0解决方案。但是,由于这不是.NET的标签,我将提供我的C++解决方案来解决这个问题。这可能适用于.NET土地,但我会将其留给其他人。

这不仅更新我的应用程序的关于框和日志文件中的版本信息,还更新Windows资源管理器中显示的所有Windows版本信息。

UPDATE:添加了自我原来的答案以来我对过程所做的一些更改。

首先,我把从我Project.rc文件的完整版本信息块我Project.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)重建使用Devenv命令行的所有项目之前修改在VersionInfo.h文件版本信息。

,我补充说,还可能有兴趣(尽管还没有完全完善,在这里可以是一个未来的问题)是生成一个唯一的版本号每个项目建成时间的一个附加步骤。在目前的化身中,它始终适用于完整的重建,但只能在增量构建中零星地使用。我所做的就是创建一个名为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 ---------------------------------------------------------------------- 

此文件包含在需要使用的版本号项目中的任何文件(即约盒)。

一些这是从this CodeProject post.

搜集希望这些信息对您有用。

2

我有同样的问题,而且我发现,修改.vdproj文件在prebuildevent并不完全是做什么 我喜欢。

我用一些其他的代码来修改msi文件文件的安装项目已经构建完成后,所以我用了postbuildevent

看到我的博客文章here

0

我知道这是一个非常古老的线程,但这里有一个vbs的解决方案,实现同样的目的。只需将它放在.vdproj文件旁边的部署文件夹中即可。

Function CreateGuid() 
    CreateGuid = Left(CreateObject("Scriptlet.TypeLib").Guid,38) 
End Function 

Const ForReading = 1, ForWriting = 2, ForAppending = 8 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set RegEx = CreateObject("VBScript.RegExp") 

For Each file in fso.GetFolder(".").Files 
    if (fso.GetExtensionName(file.Name) = "vdproj") then 
     WScript.Echo "Updating: " + file.Name 
     Set oFile = fso.OpenTextFile(file.Name, ForReading, True) 
     fileContents = oFile.ReadAll 
     oFile.Close 
     RegEx.Pattern = """ProductCode"" = ""8:{.*-.*-.*-.*-.*}" 
     fileContents=Regex.Replace(fileContents, """ProductCode"" = ""8:" & CreateGuid) 
     Set oFile = fso.OpenTextFile(file.Name, ForWriting, True) 
     oFile.Write fileContents 
     oFile.Close 
    end if 
Next 

然后在你的实际项目中,也有类似的后生成事件:

cd $(SolutionDir)\CustomWebSetup 
cscript -nologo UpdateProductCode.vbs 

这将更新一个新的产品代码的vdproj在为下一个构建做准备。构建完成后,VS将提示重新加载部署项目。