Tôi biết rằng áp phích gốc đang tìm kiếm giải pháp .NET 2.0 cho vấn đề này. Tuy nhiên, vì điều này không được gắn thẻ như .NET, tôi sẽ cung cấp giải pháp C++ cho vấn đề này. Điều này có thể được áp dụng trong đất .NET, nhưng tôi sẽ để nó cho người khác.
Điều này không chỉ cập nhật thông tin phiên bản trong hộp giới thiệu và tệp nhật ký cho ứng dụng của tôi, mà còn tất cả thông tin phiên bản Windows được thấy trong Windows Explorer.
CẬP NHẬT: Đã thêm một số thay đổi mà tôi đã thực hiện cho quy trình kể từ câu trả lời ban đầu của mình.
Trước hết, tôi chuyển toàn bộ khối thông tin phiên bản từ tập tin Project.rc tôi để tập Project.rc2 tôi:
/////////////////////////////////////////////////////////////////////////////
//
// 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
này chủ yếu vận chuyển tất cả các phiên bản thông tin thứ mà bạn sẽ chỉnh sửa từ tài nguyên biên tập vào một tập tin riêng biệt. Điều này làm cho nó để bạn không nhận được lỗi khi chỉnh sửa các tập tin tài nguyên từ bên ngoài của trình soạn thảo. Nhược điểm là bạn không còn có thể chỉnh sửa thông tin phiên bản từ trình soạn thảo tài nguyên. Nhưng, vì chúng tôi muốn công cụ này được cập nhật tự động, đó không phải là vấn đề lớn.
Tiếp theo, tôi đã tạo một VersionInfo.h tập tin và thêm nó vào dự án của tôi:
#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."
sau đó tôi bao gồm VersionInfo.h trong file RC2 và thực hiện các thay đổi sau:
#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>
Với thiết lập này, tôi có thể chỉnh sửa xây dựng kịch bản của tôi (sử dụng Perl) để sửa đổi thông tin phiên bản trong tệp VersionInfo.h trước khi xây dựng lại toàn bộ dự án bằng cách sử dụng dòng lệnh devenv.
Một bước bổ sung mà tôi đã thêm cũng có thể quan tâm (mặc dù chưa hoàn toàn được hoàn thiện và có thể là câu hỏi trong tương lai) là tạo số bản dựng duy nhất mỗi khi dự án được xây dựng. Trong hóa thân hiện tại, nó luôn hoạt động cho việc xây dựng lại hoàn toàn, nhưng chỉ thỉnh thoảng trên các bản dựng tăng dần. Những gì tôi đã làm là tạo một tệp có tên build_number.incl có chứa các thông tin sau:
#define CurrentBuildNumber "20081020P1525"
Về bản chất, ngày và giờ bắt đầu xây dựng. Tôi tạo ra một tập tin thực thi được chạy như một sự kiện trước khi xây dựng cho dự án tạo ra tập tin này. Kịch bản cũng định nghĩa BuildYear để bản quyền trong tệp VersionInfo.h luôn chứa năm của bản dựng gần đây nhất. Tập lệnh lô là như sau:
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 ----------------------------------------------------------------------
Tệp này sau đó được đưa vào bất kỳ tệp nào trong dự án cần sử dụng số bản dựng (ví dụ: hộp giới thiệu).
Một số này được lượm lặt từ this CodeProject post.
Hy vọng thông tin này chứng minh hữu ích.
loại dự án này là gì? C++ hoặc C#/vb? –
Dự án là một triển khai triển khai C#, tôi đang sử dụng .Net 2.0. –
bất kỳ giải pháp cuối cùng nào có mã nguồn đầy đủ? dự án vdproj là gì? – Kiquenet