我在 Visual Studio 2010 解决方案中有许多 Visual C++ 项目。此解决方案中还有一个 WiX 项目,它为作为 C++ 项目之一的产品的可执行文件构建安装程序。
可执行文件在其项目中有一个资源文件,该文件将程序的版本写入可执行文件。
现在,我想使用与资源文件写入可执行文件的版本相同的编号对 WiX 构建的安装程序进行版本控制。我在 StackOverflow 上搜索了与 WiX 相关的帖子,发现了这个帖子:
从 WiX 设置项目引用在 WiX 库项目中定义的 WixVariable
接受的答案似乎表明一个可能的解决方案是在 BeforeBuild 目标中使用 MSBuild 和 GetAssemblyIdentity 任务从另一个文件获取版本号(在 SO 问题的情况下是 DLL,在我的情况下是可执行文件)并在 WiX 构建安装程序之前将其公开给 WiX。
我尝试将其添加到我的 .wixproj 文件的 MSBuild 部分,但是当我尝试构建安装程序时,我收到一条错误消息:
error MSB3441: Cannot get assembly name for "<ExePath>". Could not load file or assembly '<ExeName>.exe' or one of its dependencies. The module was expected to contain an assembly manifest.
我似乎在 MSDN 上找不到有关此错误的任何信息,因为它与 MSBuild 相关。我检查了构建的可执行文件,它上面肯定有一个版本号(以及 .rc 文件中的其余信息),WiX 项目取决于输出可执行文件的项目;所以我假设它的 BeforeBuild 任务是在它所依赖的项目完全构建之后运行的。
我是否应该使用不同的任务而不是 GetAssemblyIdentity 从 MSBuild 中的 .exe 检索版本号,在 GetAssemblyIdentity 工作之前是否需要满足其他要求,或者只是无法获取有关 .exe 文件的此类信息微软构建?
编辑 :
我接受了 Rob 的回答,因为我误解了 ProductVersion 和 FileVersion 之间的区别,他建议的 WiX 技术正在按预期工作,并且是朝着我需要的解决方案迈出的一步。
FileVersion 只是可执行文件的属性。Msi 文件本质上是数据库,而 ProductVersion 是该数据库中的一个条目;他们没有要设置的 FileVersion 属性。他建议的方法在 .msi 数据库中正确设置 ProductVersion。
这个问题的标题现在与我实际遇到的问题并没有真正的关系,因为我正在寻求一个我认为我当时需要的解决方案。我现在已经解决了根本问题,它只是访问安装程序的 ProductVersion。我在这里找到了一个在线发布的 cscript 脚本:http: //kentie.net/article/wixnameversion/index.htm,它显示了如何访问 .msi 的 ProductVersion。使用它使我能够提取 ProductVersion 并在其他工具中使用它。