强制升级,覆盖安装,WPF安装包,安装目录没有自动匹配现有安装目录

Microsoft Visual Studio 2017 Installer 制作的WPF安装包,默认安装路径 DefaultLocation [ProgramFilesFolder][Manufacturer]\[ProductName]
在自定义操作编辑器中,加了自定义代码,修改权限、注册表等。
现在的问题是,升级安装,如何更改默认安装路径。
尝试在自定义代码中更改系统默认安装路径,安装完后再改回去。但不可行,原因是安装过程是:欢迎界面->安装路径->自定义代码->安装进度->完成。
想问问各位大神,用哪种方法可以修改vs installer安装包的默认安装路径,看能不能改掉这个缺陷。

这也是比较懒的一种,使用微软集成的打包安装包,没有使用自定义安装界面。但也是通用的一种方式,希望找到解决方案,也供后来者参考。

望踊跃回复,一个不起眼的想法,就是一种思路,或许就是一种解决方案。

欢迎界面->安装路径->...
这里的安装途径配置框不就是用来"更改默认安装路径"?

这里用户是可以随意选择,现在的想法是,在用户选择前,程序把用户上次安装的路径加载进来。

那你的自定义代码要发生在“安装路径”配置前。

如果上次安装把安装路径写到注册表,你可以用自定义代码读出。

如果上次安装没有特殊动作,则比较麻烦。
你可能要用MsiEnumRelatedProducts API,传入UpgradeCode来找到上次安装的ProductCode。
用MsiEnumComponents,然后MsiGetComponentPath来找上次的安装路径。

其实,升级到上次安装路径并不是必要的。
一个好的安装/升级程序,只需做好配置迁移,升级到哪里并不重要。

是的,非常赞同!!!话说安装包/升级包,两个版本之间没有半毛钱关系。而且我这个升级覆盖安装很彻底的,即没有覆盖掉本地缓存数据库,又把上次的安装文件清除的干净!其他的问题都被解决,没毛病。唯独不能再次更改安装路径。它应该是微软遗留的bug。但一定有解决办法。

我的自定义代码放在以下路径,怎么样,我才能做到 自定义代码要发生在“安装路径”配置前。

只定义了2个方法,1个是安装之前,1个是安装之后。是不是还有其他的方法,或者说预安装之前


public HmInstaller()
{
    InitializeComponent();
    this.BeforeInstall += new InstallEventHandler(InstallerTest_BeforeInstall);
    this.AfterInstall += new InstallEventHandler(InstallerTest_AfterInstall);
}

 

在msi概念里,产品升级(Major Upgrade)是指
一、同一个产品线(Upgrade Code必须是一样的);
二、版本必须增长;
三、ProductCode必须变化。

在升级过程种,旧的产品将自动被卸载,新的产品将被安装。

你引导的这些都是在这次做这个安装包的时候,一点一滴的清楚。也被我完美解决掉。现在唯一的瑕疵,就是改不了升级包的安装路径。我隐约文章可能还是在路径设置的这些属性中,也依次对照了这些属性值,可能还是没有更深入。
 

我不认为System.Configuration.Install.Installer能改变安装路径。

原因是Configuration.Install.Installer,以及它的那些BeforeInstall,AfterInstall事件,并不属于msi的范畴。
那些BeforeInstall,AfterInstall事件是由installutil.exe来调用的。
当installutil得到调用时,文件拷贝步骤已经完成。

"Microsoft Visual Studio 2017 Installer"可以完成简单的安装任务。
但是,如果你需要比较高级的自定义步骤,要有心理准备使用其他产品(Wix,InstallShield等等)。

有道理。但我要补充一下。根据检查到的执行顺序,以及使用过程中,除了不能更改路径之外。其他方面都做到了。那么小蜜蜂论坛发帖机它具有的优势有哪些呢?
1,微软自己的产品,用户体验很好。
2,快速生成,微软自己集成的嘛,要是没有什么特殊要求,自定义代码都不需要。
3,删除的很干净彻底。
4,也是很重要的一点,不会被当作病毒上报,对于程序的发布非常利好。

你可以下载一个微软的orca工具,可以用来打开和检查msi安装数据库。

InstallExeccuteSequence表登记了安装的步骤顺序(数字就是执行顺序)
可以看到类似如下节选:
FindRelatedProduct 200
ERRCA_CANCELNEWERVERSION 201
InstallInitialize 1500
InstallFiles 400
_EFC74C27_365C_4D20_9122_3A50518BC0D1.install 5998

其中,
FindRelatedProduct用来侦测升级
ERRCA_CANCELNEWERVERSION(VS Installer添加的)如果产品版本下降,用来抱怨退出
InstallInitialize 正式进入安装(如果需要用户权限提升,UAC要在这步前完成)
InstallFiles用来拷贝文件
_EFC74C27_365C_4D20_9122_3A50518BC0D1.install(VS Installer添加的)这就是你添加的CustomAction。

如果你查看CustomAction表,你可以看到关联的_EFC74C27_365C_4D20_9122_3A50518BC0D1.install记录。
它的意思就是调用installutil来登记你的托管Assembly。

可以看到,_EFC74C27_365C_4D20_9122_3A50518BC0D1.install 5998被远远的安排在InstallFiles 4000的后面
当你的”自定义代码,修改权限、注册表“等操作发生的时候,文件拷贝早已经完成了。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值