我在Visual Studio 2010解决方案中有许多Visual C++项目。在这个解决方案中还有一个WiX项目,它为C++项目之一的产品构建可执行文件的安装程序。在MSBuild中获取本机exe的文件版本
可执行文件的项目中有一个资源文件,该文件将程序的版本写入可执行文件。
现在我想用与由资源文件写入可执行文件的编号相同的编号来编译WiX构建的安装程序。我搜索StackOverflow上的WiX的相关帖子,发现这个帖子:
Referencing a WixVariable defined in a WiX Library Project from a WiX Setup Project
接受的答案到,似乎表明一个可能的解决方案是使用的MSBuild和GetAssemblyIdentity任务在BeforeBuild目标从另一个文件中获取版本号(在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工作之前是否还有其他需求需要满足,还是仅仅是无法获得有关此类信息的信息MSBuild中的.exe文件?
编辑:
我接受Rob的答案,因为我是误解的ProductVersion和文件版本,以及WiX的技术,他建议,正在按原计划,是对我所需要的溶液的步骤之间的差异。
FileVersion只是可执行文件的一个属性。 Msi文件本质上是数据库,而ProductVersion是该数据库中的一个条目;他们没有FileVersion属性来设置。他建议的方法在.msi数据库中正确设置了ProductVersion。
这个问题的标题现在并不真正与我实际存在的问题有关,因为我当时正在寻求一种我认为我当时需要的解决方案。我现在已经解决了只能访问安装程序的ProductVersion的根本问题。我在这里发现了一个cscript脚本:http://kentie.net/article/wixnameversion/index.htm显示了如何访问.msi的ProductVersion。使用它可以让我提取ProductVersion并在其他工具中使用它。
会使用预处理器扩展来抓取文件版本是不可能的? – Netfangled 2013-04-10 20:57:35
您使用的是什么版本的WiX工具集? – 2013-04-10 23:27:36
我使用的是版本3.7 – Alex 2013-04-11 00:18:56