当前位置: 首页 > news >正文

InstallShield打包升级时不覆盖原有文件的解决方案

一个.NET Framework的Devexpress UI Windows Form项目,用的InstallShield,前些个版本都好好的,最近几个版本突然就没法更新了,每次更新的时候都覆盖不了原文件,而且这样更新后第一次打开程序(虽然是老程序)还会执行一遍安装,如果安装介质已经没有了,程序都进不去了。折腾了一阵,终于把这个事情的来龙去脉弄清楚了。

为什么没法覆盖

这里得说到InstallShield打的包有两种升级模式,一种是Minor Upgrade,也就是小版本更新,这种更新通常采用覆盖安装的方式,上面说的没法覆盖原文件就是在这种安装方式下出现的,通常1.1更新到1.2这样的就会采用Minor Upgrade;另一种是Major Upgrade,大版本更新,这种更新会先卸载原有的安装,然后装新版本,通常1.x更新到2.x就会采用这种更新方式。

原因:官方文档里有一段话

If any components or features have been deleted from the latest version of the setup, you must perform a major upgrade to avoid potential problems associated with leaving resources and registrations on a machine. Also note that if you move a feature or component to another location in the setup, you have effectively deleted it from its original location.

意思是如果删了某个组件,就没法使用Minor Upgrade了,就得用Major Upgrade。看到这个的时候我是迷茫的,我啥也没删呀。

删了什么?

好在InstallShield可以自己对比两个版本。在Upgrade里加一个Minor Upgrade,然后在Setup To Upgrade里选择之前版本的安装包。
在这里插入图片描述

设置好之后Build一下,他就会报错,表示新版本比旧版本缺东西,但是很可惜他不会告诉我们缺什么,只会告诉GUID,如下图。
在这里插入图片描述

找回文件

上面的GUID并不会和缺失的文件名关联起来,我们依旧不知道删了什么,那么怎么找回来呢?嗯。。找不回来,不过,有个操作可以抢救一下。

  1. 安装旧版本的软件;
  2. 用新版本的软件更新;
  3. 卸载软件;
  4. 看安装目录下剩下什么。
    这个的原理是在更新成新版本后卸载时只会卸载新版本里有的组件,新版本里没有的东西他就会留着,所以剩下的就是删掉的东西。

恢复组件

找到删了什么之后就是得把这些文件加进来了,有可能是文件,也有可能是需要添加引用,然后在InstallShield里把文件加进来。重新加进来的组件他会重新随机生成一个GUID,需要手动改回原来的GUID。理论上是没法严格对应的,我也不知道需不需要严格对应,我就是按着文件名的排序一个个改下来,确实能用。

写在最后

我应该是没有手动删过什么东西的,但还是出现了这个问题,丢失的全是Devexpress的dll,我猜是我在开发过程种尝试了一些组件,某个版本虽然把引用删了,但是没有清理项目,就一直都在,我又加进了InstallShield,后来清理了一下,就没了。或者也有可能是Vistual Studio 和 InstallShield同时开着,突然的变动就导致InstallShield侦测到文件没了,再出现也重新给了我个GUID。有知道原因的大哥请指教一下。

http://www.lryc.cn/news/164868.html

相关文章:

  • 服务器巡检表-监控指标
  • 无涯教程-JavaScript - DDB函数
  • uniapp打包微信小程序。报错:https://api.weixin.qq.com 不在以下 request 合法域名列表
  • stm32之31.iic
  • 新的 ChatGPT 提示工程技术:程序模拟
  • 【Python】爬虫基础
  • leetcode分类刷题:队列(Queue)(三、优先队列用于归并排序)
  • 无线窨井水位监测仪|排水管网智慧窨井液位计安装案例
  • 024 - STM32学习笔记 - 液晶屏控制(一) - LTDC与DMA2D初始
  • Python数据容器:dict(字典、映射)
  • 2023年基因编辑行业研究报告
  • Spring MVC:请求转发与请求重定向
  • 按键灯待机2秒后灭掉
  • SpringBoot通过自定义注解实现日志打印
  • 代码随想录算法训练营第七天 |151.翻转字符串里的单词
  • 【WebRTC---源码篇】(十:一)WEBRTC 发送视频RTP包
  • cmd 90 validate error!(达梦数据库日志报错)
  • Shape Completion Enabled Robotic Grasping
  • 【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )
  • VMware16安装ghost版win7
  • 项目集成swagger,访问不到swagger页面
  • 微信小程序怎么隐藏顶部导航栏(navigationBar)变透明的解决方案
  • RabbitMQ基础概念-02
  • 从构建者到设计者的低代码之路
  • Linux创建进程 及父子进程虚拟空间 多进程GDB调试
  • uni-app 之 表格设置
  • Linux易混淆知识点
  • 移植FlashDB、SFUD到STM32f407
  • 【算法基础】时间复杂度和空间复杂度
  • 解决微信小程序不支持TextEncoder/TextDecoder对象