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]


你说得对,我错过了版本。h包含了另一个打开潘多拉盒子的.h。