我在Visual Studio 2010解决方案中有许多Visual C ++项目。此解决方案中还包含一个WiX项目,该项目将为其中一个C ++项目的产品的可执行文件构建安装程序。
可执行文件在其项目中有一个资源文件,该文件将程序的版本写入可执行文件。
现在,我想对WiX内置的安装程序进行版本控制,其编号与资源文件写入可执行文件的编号相同。我搜索了StackOverflow上与WiX相关的帖子,并发现了以下帖子:
Referencing a WixVariable defined in a WiX Library Project from a WiX Setup Project
对此的公认答案似乎表明,可能的解决方案是使用BeforeBuild Target中的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工作之前是否还有其他要求要满足,或者是否无法在Windows中获取有关.exe文件的此类信息。 MSBuild?
编辑:
我接受了Rob的回答,因为我误解了ProductVersion和FileVersion之间的区别,并且他建议的WiX技术按预期工作,并且是我所需解决方案的一步。
FileVersion仅是可执行文件的属性。 Msi文件本质上是数据库,而ProductVersion是该数据库中的条目;它们没有要设置的FileVersion属性。他建议的方法可以在.msi数据库中正确设置ProductVersion。
现在,这个问题的标题与我实际遇到的问题并没有真正的关系,因为我当时正在寻求我认为当时需要的解决方案。现在,我已经解决了根本问题,该问题只是可以访问安装程序的ProductVersion。我在此处在线发布了一个cscript脚本:http://kentie.net/article/wixnameversion/index.htm,该脚本显示了如何访问.msi的ProductVersion。使用该功能,我可以提取ProductVersion并在其他工具中使用它。
最佳答案
如果您不需要MSBuild中的版本,一个更简单的解决方案是直接在.wxs文件中引用该文件的版本。这是一个片段,显示了如何做:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Version="!(bind.fileVersion.ExeWithVersion)" ...>
...
<Component ...>
<File Id="ExeWithVersion" Source="path\to\your\versioned\file.exe" />
</Component>
...
</Product>
</Wix>
魔术是
!(bind.fileVersion.Xxx)
说要用File
查找Id='Xxx'
元素并获取其版本。这是将文件版本放入MSI软件包的最简单方法。