msbuild - 如何在编译时将正确的版本信息注入(inject)到资源中?

标签 msbuild resourcebundle versioninfo

我惊讶地发现显然不可能在资源文件 (.rc) 中导入 C 预定义宏,因为资源编译器无法处理它们。

我试图将版本信息放入将由构建系统生成/更新的version.h中。该文件应该包含在 resource.rc 中,因此当您构建资源时,您将始终在所有构建的文件中获得相同的版本。

看来这与RC_INVOKED和这个bug有关http://connect.microsoft.com/VisualStudio/feedback/details/532929/rc4011-warnings-from-vc10-rc -- 作为“按设计”关闭。

如何解决这个问题?

是唯一的选择来修补最终的exe以更新版本信息吗? ...我不想这样做,而是使用更标准的方法。

最佳答案

资源编译器可以很好地处理包含和预处理器定义。例如,它不能很好地处理包含 Windows.h 的情况。但我想不出任何充分的理由说明为什么您需要在资源编译器使用的文件中使用它。只需使用不包含任何导致警告的头文件,然后定义您需要的内容即可。作为一个例子,我们在这里使用的典型版本控制可以做到这一点并且效果很好:有一个单个主.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

从现在开始,可能性几乎是无限的。将 VRC_INCLUDE 定义为包含所有 VRC_... 定义的包含文件的完整路径:

rc/d VRC_INCLUDE=$(VersionMainIninclude) ... version.rc

或提供所有定义

rc/d VRC_COMPANYNAME=mycompany ... version.rc

或两者的组合。

为了向您展示可能性,以下是我目前正在为所有使用 git 进行版本控制的项目所做的事情:

  • 每个项目都有一个 version.h #定义一个简短的 VRC_FILEDESCRIPTION 和 VRC_FILEVERSION
  • 有一个主版本.h #defining VRC_COMPANYNAME/VRC_COPYRIGHT/...
  • 该项目包含一个 .targets 文件,该文件在预构建事件中创建 version.res
  • msbuild 预构建事件负责有趣的事情:它创建一个新的临时头文件,结合其他两个文件,获取短 git SHA 和当前数据,并将其附加到文件描述字符串中,这样它就结束了看起来像

    Foo Dll [12e454re 30/07/2013]

关于msbuild - 如何在编译时将正确的版本信息注入(inject)到资源中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928728/

相关文章:

visual-studio-2010 - TeamCity 不编译 Visual Studio MS 测试项目

带参数的 Dojo i18n 资源文件

windows - 在 Windows 上的 Qt 可执行文件中设置应用程序信息

visual-studio - 获取自定义构建步骤的包含目录

bash - cygwin - 使用开关运行 msbuild

visual-studio - 使用 VSTS 部署 Azure WebJob

java - 如何在资源包中处理角色星号

XCode,Swift(域 = NSPOSIXErrorDomain,代码 = 22)

c - 以编程方式更改外部 DLL 的 VersionInfo

delphi - 如何在Delphi应用程序中使用项目版本信息?