在MSBuild中获取本机exe的文件版本

Ale*_*lex 3 windows-installer wix visual-studio wix3.7

我在Visual Studio 2010解决方案中有许多Visual C++项目.此解决方案中还有一个WiX项目,它为可执行文件构建安装程序,该安装程序是其中一个C++项目的产品.

可执行文件在其项目中有一个资源文件,它将程序的版本写入可执行文件.

现在,我想将WiX构建的安装程序的版本与资源文件写入可执行文件的编号相同.我在StackOverflow上搜索了WiX相关帖子,发现这篇文章:

从WiX设置项目引用WiX库项目中定义的WixVariable

接受的答案似乎表明可能的解决方案是使用MSBuild和BeforeBuild Target中的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.
Run Code Online (Sandbox Code Playgroud)

我似乎无法在MSDN上找到有关此错误的任何信息,因为它与MSBuild有关.我检查了构建的可执行文件,它肯定有一个版本号(以及.rc文件中的其余信息),WiX项目依赖于输出可执行文件的项目; 所以我假设它的BeforeBuild任务在它所依赖的项目完全构建之后运行.

我应该使用不同的任务而不是GetAssemblyIdentity从MSBuild中的.exe检索版本号,在GetAssemblyIdentity工作之前是否还有其他要求要满足,或者是否无法获得有关.exe文件的此类信息的MSBuild?

编辑:

我接受了Rob的回答,因为我误解了ProductVersion和FileVersion之间的区别,并且他建议的WiX技术按预期工作,并且是迈向我需要的解决方案的一步.

FileVersion仅是可执行文件的属性.Msi文件本质上是数据库,ProductVersion是该数据库中的一个条目; 它们没有要设置的FileVersion属性.他建议的方法正确地在.msi数据库中设置ProductVersion.

这个问题的标题现在与我实际遇到的问题没有关系,因为我当时正在寻求一个我认为我需要的解决方案.我现在已经解决了只是访问安装程序的ProductVersion的根本问题.我在网上发现了一个cscript脚本:http://kentie.net/article/wixnameversion/index.htm,它显示了如何访问.msi的ProductVersion.使用它可以让我提取ProductVersion并在其他工具中使用它.

Rob*_*ing 7

如果您不需要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>
Run Code Online (Sandbox Code Playgroud)

神奇的是!(bind.fileVersion.Xxx)说要查找File元素Id='Xxx'并获得其版本.这是将文件版本放入MSI包的最简单方法.