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

2024-02-21

我在 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 并在其他工具中使用它。


如果您不需要 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 包的最简单方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何从外部IP地址访问Solr?

    我在 Jetty 容器中的本地主机上的服务器上运行 Solr 这似乎是一个显而易见的问题 但如何从服务器本身外部 例如外部 IP 地址 访问 Web 界面 显然 身份验证作为任何解决方案的一部分都很重要 我还在服务器上运行 Apache2
  • 运行多个 docker compose

    我正在使用一个在 3 个不同的 docker 镜像上运行的应用程序 第一个是可使用 REST API 调用的服务器 HTTP 第二个是rabbitmq 第三个是工人 整个应用程序启动时docker compose up 真的很简单 我想让它
  • Angular-ui 引导模式无需创建新控制器

    plunk http plnkr co edit 85Wl5W http plnkr co edit 85Wl5W如果我在同一个控制器 modalController js 上使用 modalInstance 而不处于模态中 则角度会被冻结
  • 如何在微分方程(SciPy)中使用 if 语句?

    我正在尝试用 Python 求解微分方程 在这两个系统微分方程中 如果第一个变量的值 v 超过阈值 30 应将其重置为另一个值 65 下面我贴上我的代码 问题是第一个变量的值在达到 30 后保持不变 不会重置为 65 这些方程描述了单个神经
  • AssertionFailedError:布尔方法为 null

    我正在测试一个方法 该方法接受两个对象作为参数并返回一个boolean 当我使用和assertTrue or assertFalse对于有问题的方法 我得到以下测试失败 junit framework AssertionFailedErro
  • 是否有可能毁掉 CDI 瞄准镜?

    我正在开发一个 Java EE 应用程序 主要是带有 JSF 管理控制台的 JAX RS 它使用 CDI Weld 进行依赖项注入javax enterprise context ApplicationScoped http downloa
  • 如何确保重写的方法是同步的

    我有一类线程安全的通用代码 该类中的方法之一是抽象的 需要针对不同的实现进行重写 我需要确保或至少向其他开发人员标记该方法的所有实现都需要是线程安全的 做这个的最好方式是什么 是否有关键字或注释来实现此效果 我已经尝试过了abstract
  • 获取数组的整行

    我下面有以下代码 我想要获取整行 而不仅仅是原始数组的第 1 列 我该怎么做 Sub Example1 Dim arrValues As Variant Dim lastRow As Long Dim filteredArray Dim l
  • 找不到 MongoRepository (Spring Boot) 的 bean

    我在用spring boot and MongoDB Spring version 4 3 9 Spring boot version 1 5 4 我正在创建一个实现的存储库MongoRepository interface 如下所示 im
  • 如何在 Eclipse ant 编辑器中启用撤消功能?

    在 Eclipse 的 ant 编辑器中 撤消对我不起作用 当我按 Ctrl Z 时 没有任何反应 是否可以以某种方式启用撤消或者这是一个错误 我在 Windows XP Professional 上使用 Eclipse 3 4 2 Gan
  • Firebase 函数仅授权来自 Firebase 托管应用的请求

    我有一个简单的 Firebase Hosting Web 应用程序 基于 Vue 应用程序 它调用 Firebase 函数 Google 云函数 import firebase from firebase app import fireba
  • 大数计算错误:为什么会发生这种情况? [复制]

    这个问题在这里已经有答案了 我在 repl it 中创建了一个小型 Python 程序来说明 Collat z 猜想 该猜想表示 如果以任意正整数 n 开头 并递归地应用以下运算 如果 n 为偶数 则为 n 2 如果 n 为偶数 则为 3n
  • 发送消息时如何使用 Selenium 在 WhatsApp 中换行?

    消息发送功能 template other Text More Text Much more text def send message driver answer driver find element by xpath XPATH cl
  • 使用 Google Maps API V3 确定标记是否位于 KML 图层边界内

    有没有办法确定标记是否已进入 KmlLayer 覆盖的区域 我的 kml 主要由
  • r:使用所有可能的选项和变量组合数量创建数据框

    这个问题可能很明显或已经被问过 但我找不到解决方案 我想创建一个包含所有可能组合 和变量数量 的数据框 如下例所示 dataframe lt data frame variable 1 4 a c gender NA NA NA b c a
  • 使用 Azure API 管理模拟故障转移

    Azure API 管理支持多区域部署 这对于我们的 API 和后端服务的 HA 非常有用 我们正在使用它来测试我们的多区域部署 但是 我们如何测试它呢 我们如何模拟或手动触发 API 管理上的故障转移 提前致谢 APIM 的优质捆绑提供了
  • 使用 xargs 进行并行 Python 脚本

    我目前有一个 bash 脚本 script sh 带有两个嵌套循环 第一个枚举 a 的可能值 第二个枚举 b 的可能值 例如 bin sh for a in 1 10 do for b in 1 10 do nohup python scr
  • Nuxt SSR - 我无法检查用户是否经过身份验证

    我正在尝试使用带有会话身份验证的 Django 后端的 Nuxt SSR 前端 我希望在我的前端中有一些 SSR 页面以及客户端渲染的页面 所以我正在使用通用模式 问题是我没有找到一种工作方法来在加载页面之前检查用户是否经过身份验证 因此我
  • Grails 条件可为空验证或带有可为空选项的自定义验证器

    我有一个表格来创建一个地方 根据国家 地区的不同 省 州 地区 字段是否为必填项 当不需要时 我希望为null 而不是空字符串 我有使所有空表单字段为空的代码 def newparams place new Place params eac
  • 在 MSBuild 中获取本机 exe 的文件版本

    我在 Visual Studio 2010 解决方案中有许多 Visual C 项目 此解决方案中还有一个 WiX 项目 它为可执行文件 C 项目之一的产品 构建安装程序 可执行文件在其项目中有一个资源文件 它将程序的版本写入可执行文件 现