Msbuild 如何在编译时将正确的版本信息注入到资源中?
我惊讶地发现,显然不可能在资源文件(Msbuild 如何在编译时将正确的版本信息注入到资源中?,msbuild,resourcebundle,versioninfo,Msbuild,Resourcebundle,Versioninfo,我惊讶地发现,显然不可能在资源文件(.rc)中导入C预定义宏,因为资源编译器无法处理它们 我试图将版本信息放入将由构建系统生成/更新的version.h中。该文件应该包含在资源.rc中,因此当您构建资源时,所有构建的文件都将获得相同的版本 这似乎与RC\u调用的和这个bug有关——它被关闭为“按设计” 我怎样才能解决这个问题 是否为更新版本信息而修补最终exe的唯一选项。。。我不希望这样做,而是使用更标准的方法。资源编译器可以很好地处理包含和预处理器定义。它只是不能很好地处理包括Windows.
.rc
)中导入C预定义宏,因为资源编译器无法处理它们
我试图将版本信息放入将由构建系统生成/更新的version.h
中。该文件应该包含在资源.rc
中,因此当您构建资源时,所有构建的文件都将获得相同的版本
这似乎与RC\u调用的
和这个bug有关——它被关闭为“按设计”
我怎样才能解决这个问题
是否为更新版本信息而修补最终exe的唯一选项。。。我不希望这样做,而是使用更标准的方法。资源编译器可以很好地处理包含和预处理器定义。它只是不能很好地处理包括Windows.h在内的问题。但是我想不出任何好的理由,为什么你需要在一个被资源编译器使用的文件中使用它。只需使用不包含任何导致警告的头文件,并定义所需内容。作为一个例子,我们在这里使用的典型版本控制可以做到这一点,并且效果很好:有一个单独的master.rc文件,看起来像这样:
#include <winver.h>
#define stringize( x ) stringizei( x )
#define stringizei( x ) #x
#ifdef VRC_INCLUDE
#include stringize( VRC_INCLUDE )
#endif
#ifdef _WIN32
LANGUAGE 0x9,0x1
#pragma code_page( 1252 )
#endif
1 VERSIONINFO
FILEVERSION VRC_FILEVERSION
PRODUCTVERSION VRC_PRODUCTVERSION
FILEFLAGSMASK 0x1L
FILEFLAGS VS_FF_DEBUG
FILEOS VOS__WINDOWS32
FILETYPE VRC_FILETYPE
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", stringize( VRC_COMPANYNAME )
VALUE "FileDescription", stringize( VRC_FILEDESCRIPTION )
VALUE "FileVersion", stringize( VRC_FILEVERSION )
VALUE "LegalCopyright", stringize( VRC_COPYRIGHT )
VALUE "InternalName", stringize( VRC_ORIGINALFILENAME )
VALUE "OriginalFilename", stringize( VRC_ORIGINALFILENAME )
VALUE "ProductName", stringize( VRC_PRODUCTNAME )
VALUE "ProductVersion", stringize( VRC_PRODUCTVERSION )
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
#包括
#定义字符串化(x)字符串化(x)
#定义stringizei(x)#x
#ifdef VRC_包括
#包括架线(VRC_包括)
#恩迪夫
#ifdef_WIN32
语言0x9,0x1
#pragma代码页(1252)
#恩迪夫
1版本信息
文件版本VRC_文件版本
产品版本VRC\U产品版本
FILEFLAGSMASK 0x1L
文件标志VS_FF_调试
FILEOS VOS_u_WINDOWS32
文件类型VRC_文件类型
开始
阻止“StringFileInfo”
开始
块“040904E4”
开始
值“CompanyName”,字符串化(VRC_CompanyName)
值“FileDescription”,字符串化(VRC_FileDescription)
值“FileVersion”,字符串化(VRC_FileVersion)
价值“LegalCopyright”,stringize(VRC_版权所有)
值“InternalName”,字符串化(VRC_ORIGINALFILENAME)
值“OriginalFilename”,字符串化(VRC_OriginalFilename)
值“ProductName”,字符串化(VRC\U ProductName)
值“ProductVersion”,字符串化(VRC\U ProductVersion)
结束
结束
阻止“VarFileInfo”
开始
值“Translation”,0x409,1200
结束
结束
从现在开始,可能性几乎是无限的。将VRC\u INCLUDE
定义到包含所有VRC\u…
定义的INCLUDE文件的完整路径:
rc/d VRC\u INCLUDE=$(versionmainclude)。。。版本.rc
或提供所有定义
rc/d VRC\u COMPANYNAME=mycompany。。。版本.rc
或者两者兼而有之
为了向您展示这些可能性,以下是我目前为所有使用git版本控制的项目所做的工作:
- 每个项目都有一个版本。h#只定义一个简短的VRC#U文件描述和VRC#U文件版本
- 有一个主版本。h#定义VRC#U公司名称/VRC#U版权/
- 该项目包含一个.targets文件,该文件在预生成事件中创建一个version.res
- msbuild prebuild事件处理了一些有趣的事情:它创建了一个新的临时头文件,将其他两个文件合并在一起,获取短git SHA和当前数据,并将其附加到文件描述字符串中,使其看起来像
foodll[12e454re 30/07/2013]