visual-c++ - 使用 MSBuild 更新 C++ 资源文件中的 FILEVERSION 会导致编译失败

标签 visual-c++ resources msbuild

我的任务是使用 msbuild 自动化我们的构建过程。我们有大约 20 个 Visual C++ 项目和 20 个 C# 项目,这使得手动编辑所有版本字符串变得很痛苦。我们的版本号是在构建时生成的,因此我们需要在命令行上将完整版本字符串作为属性传递。

我最初的实现使用了 MSBuild Extension Pack File .rc 上做替换的任务和 AssemblyInfo.cs文件。

<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyVersion\(".*"\)\]' Replacement='[assembly: AssemblyVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(AssemblyInfoFiles)" RegexPattern='\[assembly: AssemblyFileVersion\(".*"\)\]' Replacement='[assembly: AssemblyFileVersion("$(Version)")]'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="FILEVERSION\s+\S+" Replacement="FILEVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern="PRODUCTVERSION\s+\S+" Replacement="PRODUCTVERSION $(Version)"/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"FileVersion",\s*".*"' Replacement='VALUE "FileVersion", "$(Version)"'/>
<FileSystem.File TaskAction="Replace" Files="@(RCFiles)" RegexPattern='VALUE\s+"ProductVersion",\s*".*"' Replacement='VALUE "ProductVersion", "$(Version)"'/>

这在 AssemblyInfo.cs 上运行良好文件,但是当我编译任何 C++ 项目时,我会收到如下错误:
.\MyProject.rc(23): error RC2135: file not found: 0x09
.\MyProject.rc(71): error RC2135: file not found: 1
.\MyProject.rc(72): error RC2135: file not found: 6
.\MyProject.rc(73): error RC2135: file not found: 6
.\MyProject.rc(74): error RC2135: file not found: 0x3fL
.\MyProject.rc(80): error RC2135: file not found: FILEOS
.\MyProject.rc(81): error RC2135: file not found: 0x2L
.\MyProject.rc(84): error RC2164: unexpected value in RCDATA
.\MyProject.rc(86): error RC2135: file not found: BLOCK
.\MyProject.rc(88): error RC2135: file not found: VALUE

第 23 行遇到第一个错误,但是当我 diff MyProject.rc 时反对源代码控制一切看起来都不错。只更改了版本号,这些更改从第 72 行开始,字符串 0x09不会出现在文件中的任何地方。这到底是怎么回事?第 21 - 25 行如下所示:
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

我也愿意接受有关其他方法的任何建议以实现相同的目标。

最佳答案

当 rc 文件使用 ASCII 编码时,替换任务操作正在插入 Unicode 字符。将 TextEncoding="ASCII"添加到所有 rc 替换任务会生成可编译的文件。

使用 ASCII 字符集的一个限制是不能使用 © 符号。
但是如果您选择 TextEncoding="Windows-1252"就可以解决问题。

关于visual-c++ - 使用 MSBuild 更新 C++ 资源文件中的 FILEVERSION 会导致编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2238984/

相关文章:

visual-c++ - Visual Studio 2010 中的 C++ 强类型枚举

c++ - Visual Studio 中的 OpenMP 任务

c++ - 使用 LLVM-Clang 隐式实例化私有(private) C++ 模板的链接器错误

linux - 如何创建自己的 Linux 发行版?

visual-studio-2010 - 与 MSBuild 并行的 Qt MOC 多个文件

linux - 无法在嵌入式 Linux 上构建 MonoDevelop

c++ - RegSetValueEx 和 CHAR

delphi - 如何添加资源并使用它们

asp.net - 如何从非页面的类访问 GetGlobalResourceObject 函数?

.net - msbuild/clickonce 发布构建期间生成的文件