未安装新组件的文件,因为旧组件具有相同的文件

2023-12-11

我们遇到重大更新时未安装文件的问题

  • 我们有一个重大更新<MajorUpgrade Schedule="afterInstallInitialize"...
  • 我们是来自外部制造商的带有 1 个文件(xyz.exe 版本 12.34)的旧组件
  • 现在,我们有了来自新制造商的同名新文件(xyz.exe 版本 2.34)。新文件的版本号比旧文件的版本号低。
  • 我们在安装包中创建了一个新组件并删除了旧组件(实际上我们给了它一个新的guid)
  • 更改 exe 的名称是不可能的,这会对文档和内部功能产生很大影响。

正常安装一切正常。

但是现在更新会发生什么:

  • 安装程序启动。
  • 并检测到新组件(xyz.exe)存在且版本较低,因此不会安装。
  • 安装程序运行并删除旧组件
  • 但它不会安装新的组件,因为它只是检测到该组件已安装。
  • 进行修复安装可以解决问题,并且文件会再次出现。

将 KeyPath 设置为组件可以解决该问题。但这对我来说似乎是错误的。该文件的安装目录是主安装目录。

如何强制安装该组件?


类似的答案: 如何使用 Wix 工具集在重大升级期间显式删除 dll


主要升级降级:为了在重大升级时覆盖具有更高版本号的二进制文件,有几个首选选项:

  • 首选方法是使用伴随文件(第三方文件)。
  • 或者如果你可以:编译具有更高版本号的新二进制文件(对于您自己的文件)。

配套文件:下面是有关如何使用的片段伴随文件 in WiX:

<..>

<Component Id="MyFile.exe" Feature="Main">
  <File Id="MyFile.exe" Source="MyFile.exe"></File>
</Component>

<!-- Do not re-use any GUIDs in your own sources! (very important) -->
<Component Id="MyFile_2.exe" Guid="{00000000-0000-0000-0000-3D82EA2A99AF}" Feature="Main">
  <File Source="MyFile_2.exe" CompanionFile="MyFile.exe"></File>
</Component>

<..>

一行总结:在第二个组件中,我们指向第一个组件的文件,以便MyFile_2.exe每当MyFile.exe已安装 - 无论版本控制问题如何。


然后还有许多进一步的选择:


重新安装模式:MSI 属性重新安装模式可以使用 - 但它有许多副作用:

Setup 1: 版本1.0.0对于设置:

msiexec.exe /i Setup1.msi /qn

Setup 2: 版本2.0.0对于主要升级设置:

msiexec.exe /i Setup2.msi REINSTALLMODE=amus /qn

几个问题:REINSTALLMODE 有几个问题,使其成为一个不安全的功能(尝试emus反而?查看文档- 也许少一点蛮力)。遗憾的是,此设置适用于设置中的所有功能 - 这使得它非常危险:

  • 可以在系统范围内降级共享文件 - 例如,如果包含合并模块(Windows 中的功能可以防止大多数此问题:WFP and WRP在 Vista 及更高版本中 - 非 Microsoft 合并模块仍可能导致非 Microsoft 共享文件出现问题)
  • 可能会导致版本不一致,因为旧软件包可以在新软件包之后安装,并且仅降级某些共享文件
  • 可以降级或擦除非版本化文件和注册表设置中的设置(自我注意:再次测试一下,组件设置存在复杂性)
  • 由于尝试不必要地替换相同版本的正在使用的文件,可能会导致请求重新启动的次数显着增加(真正的解决办法是正确关闭服务并使用重启管理器允许应用程序在部署期间自动关闭 -关于文件锁).
  • 还有几个非常具体的问题

破解二进制版本:一个丑陋但有效的选择是使用 Visual Studio 更改实际二进制文件的版本以设置更高的版本号(您将二进制文件作为资源打开并设置一个新版本 - 这显然与使用 Visual Studio 源代码编译来编译新版本的二进制文件有很大不同)。有几个副作用:

  • 你破坏了数字签名
  • 你可以创建“版本混乱”
  • 从 Visual Studio 编写新的二进制文件存在风险
  • 这是一个“黑客手动步骤” - 您可能需要为新版本继续执行此操作?
  • etc...

移动、重命名:如果您可以通过重命名或移动它来将新文件与旧文件分离,则可以解决该问题。如果您将来再次获得新版本,您可能需要再次执行此操作。笨重。

“加载自”:将文件放在共享的位置并从该特定位置加载它,然后从安装文件夹中删除旧副本。那行得通吗?这意味着该文件也可以通过该位置的另一个设置来传送。


版本说谎:在Installshield中,有一个能够为文件设置特定版本号的概念。我不知道如何在 WiX 中实现它。还有一个“总是覆盖选项”这显然为版本设置了最大值,因此现有文件始终会被覆盖。


一些链接:

  • 为什么 Windows Installer 会在重大升级期间删除文件(如果版本号向后)
  • “降级”MS dll 在升级时消失 - Windows Installer
  • 使用 WiX 安装文件,无论版本号如何
  • 如何更好地利用 MSI 文件
  • 它的反面:文件保存和文件覆盖规则.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未安装新组件的文件,因为旧组件具有相同的文件 的相关文章

  • WIX 工具集 - 自定义操作命令无法正确检测 Windows 10 版本

    我有一个安装程序 可以部署并运行单独的 exe文件以将驱动程序部署到系统 不幸的是 微软似乎已经放弃了对VersionNTWindows 10 及更高版本中的宏 所以我实施了另一篇文章中建议的方法 https stackoverflow c
  • 尝试加载自定义配置时,Visual Studio 安装和部署项目中出现 FileNotFoundException

    我试图在我的设置和部署项目中调用自定义操作来更新我的应用程序上的 app config 中的某些项目 我已经以通常的方式完成了自定义配置部分 例如 ConfigurationProperty serviceProvider IsRequir
  • 如何在 Mac OS X 10.9 上安装和使用最新的 Git?

    我从 sourceforge 下载了 Git 2 4 3http git scm com download mac http git scm com download mac对于我的 Macbook Pro OS X 10 9 5 然后安装
  • WIX 检测待重启

    我正在使用带有 WiX 的自定义 BA 我想检测是否存在挂起的重新启动 以在用户尝试安装之前警告他们 结果却失败了 如何在 Burn WiX 中引用重新启动挂起属性 https stackoverflow com questions 108
  • Inno Setup - 如果计算机上已安装应用程序,如何在安装时显示通知消息?

    我是 Inno Setup 的新手 我正在使用 Inno Setup compiler 5 1 6 为我的 C 应用程序创建一个安装程序 使用我的脚本创建了安装程序 并且运行良好 它会安装该应用程序 也可以从控制面板卸载 但我的问题是 如果
  • Android APK 分发没有“未知来源”复选框?

    我们正在尝试在 Google Play 之外分发我们的 Android 应用程序 有没有办法做到这一点 而不强迫用户通过设置应用程序并选中 允许未知来源 复选框 有没有办法做到这一点 而不强迫用户通过设置应用程序并选中 允许未知来源 复选框
  • Jinja 安装 python

    我不经常使用 Python 但现在我必须使用 我应该运行一个需要 Jinja 的 python sctipt Python2 7 安装在我的 Windows XP 上并且可以工作 但我找不到如何安装 inja 包 有人愿意为我写一份分步安装
  • 如何在 MSBuild 中创建新属性并在 WIX 中引用它

    我们需要创建一个属性来指示我们的软件版本 然后我们想在我们的 WIX 项目中使用它 即在 wxs 文件中引用它 我们不想在 wxs 文件中定义它 因为我们希望 MSBuild 也根据此版本号重命名输出文件 PropertyGroup 中的常
  • 为什么我的应用程序会触发另一个应用程序的安装程序?

    当使用旧版 VB6 应用程序并在该应用程序中打开某些特定表单时 会弹出属于 Microsoft Navision 安装在同一台计算机上 的 Windows Installer 如附图所示 每次都会发生这种情况 但仅限于这台机器 VB6应用程
  • Python Shapely 安装不起作用?

    有什么想法吗 我尝试卸载 Shapely 并使用 PIP 安装 我有 Anaconda 并安装了 Fiona 很好 Shapely 看起来也很好 简单代码 import fiona import shapely dirVar C Users
  • 如何说服 VS2005 msi 升级?

    我有一个使用 VS2005 用 C 编写的 Windows 服务 安装是通过一个向导调用 msiexec 来安装同样使用 VS2005 创建的 msi 文件 我在生成将从一个版本的服务升级到另一个版本的 msi 文件时遇到问题 向导程序负责
  • iPhone:应用程序安装失败并出现“无效签名者”错误

    iPhone 连接到运行最新 iTunes 版本的 Mac 我 100 确定她的 UDID 在配置文件中 她的iPhone还没有越狱 我们甚至还恢复了出厂设置 我在这一台 iPhone 上安装我们的开发版本时遇到问题 错误是 应用程序 应用
  • 使用 Powershell 远程安装 .msi

    我已经让他使用这个论坛上存在的代码来跟踪代码 cls computername Get Content C Users C201578 db Documents server txt sourcefile iceopsnas LNT Sof
  • Visual Studio 2010 与 SQL Server 2012 商业智能的正确安装顺序

    我有一个 Windows 7 64 位 旗舰版 虚拟机 想要安装以下内容 Visual Studio 2010 Ultimate SQL Server 2012 Business Intelligence with SSIS and SSR
  • 安装python启动文件

    我如何安装pythonstartup文件 以便它在命令上运行 例如python myfile py 我尝试将其安装到我的 home myuserUbuntu的目录 但它说我没有足够的权限 此外 不同的地方交替说它应该全部大写或全部小写 前面
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal
  • WiX:如何立即重新启动explorer.exe?

    我是软件打包方面的初学者 我正在使用 cpack Wix 我试图找到有关的有用信息或良好文档util 重启资源 但找不到我的问题的任何答案 Issue 我必须安装一个 ShellExtension 它需要在设置一些注册表值后重新启动 exp
  • 在 Azure DevOps 中为 Wix MSI 文件生成 GUID

    我正在为 Web 服务器应用程序和 Sitecore 前端应用程序设置 Wix 安装程序 我的问题并非特定于 Web 服务器或 Sitecore 我的问题是 Wix 以及如何使用它进行持续交付 1 Wix 需要每个文件和产品本身的 GUID
  • 如何为 Windows 安装开源 Qt 库 5 二进制版本

    这个问题具体是关于Qt libraries 5 0 0 for Windows VS 2010 406 MB at http qt project org downloads http qt project org downloads 但我
  • 在 Visual Studio 的 InstallShield 中创建 setup.exe

    Please tell me whether it is possible to create a file named setup exe I want to have the end user to a single file inst

随机推荐

  • 在 WM_SIZE 之后调整渲染目标 Direct2D 的大小

    快速问一下大家 我目前正在使用 Directx3D 和 2D 我想知道在调整 Windows 大小时是否必须重新创建渲染目标 或者 Direct2D 会自动检测到这一点 因为它绑定到 DXGISurface 交换链 当我创建它时 这是我用来
  • Kafka流处理器线程安全吗?

    我知道这个问题之前在这里被问过 卡夫卡流并发 但这对我来说很奇怪 根据文档 或者也许我遗漏了一些东西 每个分区都有一个任务 意味着不同的处理器实例 并且每个任务都由不同的线程执行 但是当我测试它时 我发现不同的线程可以获得不同的处理器实例
  • 使用 PhantomJS 包含 js 文件

    在 PhantomJS 脚本中 我尝试加载定义数组的本地 JavaScript 文件 var webPage require webpage page webPage create injected page injectJs codes
  • 将 SupportMapFragment 放置在 DialogFragment 上

    我试图在 DialogFragment 上添加 SupportMapFragment 但它返回error inflating class fragment 我不明白为什么它会被退回error inflating class fragment
  • Zend 框架有文件结构的修复版本吗?

    作为 Zend 框架的新手 我对该框架有一些与版本相关的问题 Zend Framework 是否有固定的文件结构 即文件布局的固定形式 如果是这样 这个文件结构是否会根据框架版本而变化 如果是这样 是否有任何参考资料可以了解文件结构的所有差
  • R 中的对数概率图?

    Does anyone know how to create log probability plot like this one in R where the x axis is probability and y axis is in
  • ListFragment 作为 DialogFragment

    是否可以显示ListFragment as Dialog 或者没有办法 我应该实现我自己的ListView empty TextView和不确定的ProgressBar inside DialogFragment myself 另外一个选择
  • 关于“self”关键字

    void Foo void Foo 在该方法中 void Foo 关键字self表示该类的一个实例 但在方法中 void Foo 关键字是什么self意思是 这是否意味着Class self是每个方法的两个隐式参数之一 它是一个指向对象的指
  • 使用 SQLAlchemy 的 sql.func 注册自定义函数

    如何在 sqlalchemy 中应用自定义过滤器 我尝试过 hybrid property 和 hybrid method 然而 他们给出了错误 这是我的代码 class Product db Model tablename product
  • 每天在 Swift 中重置 NSUserDefault 键

    我正在编写一个应用程序 需要每天重置存储在 NSUserDefaults 中的密钥 00 00 时 我已经实现了这一目标 但我使用的方法是一种混乱且不可靠的方法 有没有简单的方法可以实现我的目标 这是代码 extension NSDate
  • WooCommerce 在结帐时使用 Optgroup 选择下拉菜单

    我在用着WordPress 5 0 2 with WooCommerce 3 5 3我在结帐页面上创建了一个选择下拉菜单 效果很好 但是我想在其中添加一些选项组来组织选择选项 这是我的代码函数 php add action woocomme
  • WatchKit 扩展包 ID 不可用

    我已将手表套件应用程序添加到我的 iOS 应用程序中 一切工作正常且运行良好 直到我想在两个应用程序之间共享数据 每当我尝试在手表套件扩展上添加 应用程序组 功能时 它都会告诉我我的捆绑包 ID com myrealappid watchk
  • 虚拟子域:每个用户一个子域

    在我的网站上 我使用虚拟主机 因此我的用户可以拥有虚拟域 如 user1 mydomain com user2 mydomain com 等 问题是 在 user1 domain com 等虚拟域上 索引页面始终与我的索引页面 http m
  • 检测未分配的局部变量的错误(当动态变量影响代码流预测时)

    文档意味着 out 参数在发送到函数之前不需要初始化 只需声明 然而 这段代码 class Program static void Main dynamic p string s if p null T out s System Conso
  • RStudio:使用 roxygen2 构建包。不生成 NAMESPACE 文件

    这是我第一次构建 R 包 并在 devtools 和 roxygen2 的帮助下完成 在 R 目录中编写一个简单的函数并使用 devtools 制作一个说明文件后 我第一次尝试构建并重新加载 但出现错误 gt devtools docume
  • 确定函数返回类型的最简单方法

    给定一个非常简单但冗长的函数 例如 int foo int a int b int c int d return 1 using ReturnTypeOfFoo 确定函数返回类型的最简单和简洁的方法是什么 ReturnTypeOfFoo 在
  • 正在加载 Apple Pay 送货地址 无街道

    我正在尝试从以下地址中提取送货地址ABRecordRef由苹果公司提供 我有以下内容 但我的街道总是返回nil ABMultiValueRef addresses ABRecordCopyValue abRecordRef kABPerso
  • 如何使用 P3D 渲染器实现 noSmooth()?

    我想使用 P3D 渲染器通过 PGraphics 实例渲染基本的 3D 形状 而无需任何锯齿 平滑 但 noSmooth 似乎不起作用 在 OF 我记得打电话给setTextureMinMagFilter GL NEAREST GL NEA
  • 在没有公共块的情况下通过子例程将一组变量值传递给函数有哪些方法?

    我不想在我的程序中使用公共块 我的主程序调用一个子例程 该子例程调用一个函数 该函数需要来自子例程的变量 将信息集从子例程传递到函数有哪些方法 program call CONDAT i j end program SUBROUTINE C
  • 未安装新组件的文件,因为旧组件具有相同的文件

    我们遇到重大更新时未安装文件的问题 我们有一个重大更新