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。有知道原因的大哥请指教一下。

相关推荐
.Net Core 爱好者4 小时前
Redis实践之缓存:设置缓存过期策略
java·redis·缓存·c#·.net
Crazy Struggle8 小时前
.NET 7+Angular 4 轻量级新零售进销存系统
.net·angular·进销存系统
dot.Net安全矩阵8 小时前
.NET内网实战:通过命令行解密Web.config
前端·学习·安全·web安全·矩阵·.net
EdisonZhou9 小时前
大模型应用开发初探 : 通用函数调用Planner
aigc·.net·.net core
时光追逐者10 小时前
分享6个.NET开源的AI和LLM相关项目框架
人工智能·microsoft·ai·c#·.net·.netcore
Java资深爱好者21 小时前
VB.NET中如何利用ASP.NET进行Web开发
前端·asp.net·.net
Lingbug1 天前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
那个那个鱼1 天前
.NET 框架版本年表
开发语言·c#·.net
小乖兽技术1 天前
fo-dicom,第一个基于.NET Standard 2.0 开发的DICOM开源库
.net·fo-dicom
nigture1 天前
.NET全局静态可访问IServiceProvider(支持Blazor)
.net·ioc·di·rougamo