Sé que el cartel original está buscando una solución .NET 2.0 a este problema. Sin embargo, como esto no fue etiquetado como .NET, ofreceré mi solución de C++ al problema. Esto puede ser aplicable en .NET land, pero se lo dejo a otros.
Esto no solo actualiza la información de la versión en el cuadro de información y el archivo de registro para mi aplicación, sino también toda la información de la versión de Windows que se ve en el Explorador de Windows.
ACTUALIZACIÓN: Agregué algunos cambios que he hecho en el proceso desde mi respuesta original.
Para empezar, que se trasladó todo el bloque de información de la versión de mi archivo Project.rc a mi archivo 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
Esta transporta esencialmente toda la información de la versión materia que debe editar a partir del recurso editor en un archivo separado. Esto lo hace para que no tenga errores al editar el archivo de recursos desde fuera del editor. La desventaja es que ya no puede editar la información de la versión desde el editor de recursos. Pero, como queremos que esto se actualice automáticamente, no es gran cosa.
A continuación, creé un VersionInfo.h archivo y lo añadió a mi proyecto:
#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."
continuación he incluido VersionInfo.h en el archivo rc2 y realizado los siguientes cambios:
#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>
Con esta configuración, pude editar mi script de construcción (que usa Perl) para modificar la información de versión en el archivo VersionInfo.h antes de reconstruir todo el proyecto utilizando la línea de comandos devenv.
Un paso adicional que agregué que también podría ser de interés (aunque todavía no está completamente perfeccionado, y puede ser una pregunta futura) es generar un número de compilación único cada vez que se construye el proyecto. En la versión actual, siempre funciona para reconstrucciones completas, pero solo esporádicamente en compilaciones incrementales. Lo que hice fue crear un archivo llamado build_number.incl que contiene lo siguiente:
#define CurrentBuildNumber "20081020P1525"
que es esencialmente la fecha y hora en que se inició la construcción. Creé un archivo por lotes que se ejecuta como un evento de precompilación para el proyecto que genera este archivo. La secuencia de comandos también define BuildYear para que los derechos de autor en el archivo VersionInfo.h siempre contengan el año de la compilación más reciente. La secuencia de comandos por lotes es la siguiente:
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 ----------------------------------------------------------------------
Este archivo se incluye entonces en cualquier archivo en el proyecto que necesita usar el número de compilación (es decir, el cuadro Acerca de).
Algo de esto fue obtenida de this CodeProject post.
Esperamos que esta información sea de utilidad.
¿qué tipo de proyecto es este? C++ o C#/vb? –
El proyecto es un proyecto de implementación C#, estoy usando .Net 2.0. –
¿alguna solución final con código fuente completo? son proyectos vdproj? – Kiquenet