我在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软件包的最简单方法。

08-26 16:24
查看更多