我在 Visual Studio 2010 解决方案中有许多 Visual C++ 项目。此解决方案中还有一个 WiX 项目,它为可执行文件(C++ 项目之一的产品)构建安装程序。
可执行文件在其项目中有一个资源文件,它将程序的版本写入可执行文件。
现在,我想使用与资源文件写入可执行文件的版本号相同的版本号来对 WiX 构建的安装程序进行版本控制。我在 StackOverflow 上搜索了 WiX 相关的帖子,发现了这篇文章:
从 WiX 设置项目引用 WiX 库项目中定义的 WixVariable https://stackoverflow.com/questions/8400868/referencing-a-wixvariable-defined-in-a-wix-library-project-from-a-wix-setup-proj
接受的答案似乎表明可能的解决方案是使用 MSBuild 和 BeforeBuild 目标中的 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 文件的此类信息微软构建?
EDIT :
我接受了 Rob 的回答,因为我误解了 ProductVersion 和 FileVersion 之间的区别,而他建议的 WiX 技术正在按预期工作,并且是朝着我需要的解决方案迈出的一步。
文件版本只是可执行文件的一个属性。 Msi 文件本质上是数据库,ProductVersion 是该数据库中的一个条目;它们没有要设置的 FileVersion 属性。他建议的方法可以正确设置 .msi 数据库中的 ProductVersion。
这个问题的标题现在与我实际遇到的问题并不真正相关,因为我正在寻求一个我认为当时需要的解决方案。我现在已经解决了根本问题,即简单地访问安装程序的产品版本。我在这里找到了一个在线发布的cscript脚本:http://kentie.net/article/wixnameversion/index.htm http://kentie.net/article/wixnameversion/index.htm显示如何访问 .msi 的 ProductVersion。使用它可以让我提取 ProductVersion 并在其他工具中使用它。