我知道最初的发帖人正在寻找解决此问题的 .NET 2.0 解决方案。然而,由于它没有被标记为 .NET,我将提供我的 C++ 解决方案来解决这个问题。这可能适用于 .NET 领域,但我将把它留给其他人。
这不仅会更新我的应用程序的 about 框和日志文件中的版本信息,还会更新在 Windows 资源管理器中看到的所有 Windows 版本信息。
更新:添加了自我最初回答以来我对流程所做的一些更改。
首先,我将整个版本信息块从我的 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>
通过此设置,我可以在使用 devenv 命令行重新构建整个项目之前,编辑我的构建脚本(它使用 Perl)来修改 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 ----------------------------------------------------------------------
然后,此文件将包含在项目中需要使用内部版本号的任何文件中(即 about 框)。
其中一些来自this CodeProject post.
希望这些信息对您有所帮助。