.net 如何防止MSI主要升级执行旧版本的自定义操作
我有一批MSI安装程序是使用Visual Studio 2015安装项目编写的,它们部署了以.NET 4.6.1 AnyCPU为目标的程序集。它们都使用.net 如何防止MSI主要升级执行旧版本的自定义操作,.net,windows-installer,visual-studio-setup-proje,.net,Windows Installer,Visual Studio Setup Proje,我有一批MSI安装程序是使用Visual Studio 2015安装项目编写的,它们部署了以.NET 4.6.1 AnyCPU为目标的程序集。它们都使用RemoveExistingProducts操作实现主要的升级行为,该操作在InstallInitialize之后立即排序。他们有.NET自定义操作,可以执行以下操作: 创建事件源 将TARGETDIR写入特定注册表路径以供以后使用 调整IIS虚拟目录属性 根据在msiexec命令行上传入的安装程序变量,更改已安装的web.config文件的内
RemoveExistingProducts
操作实现主要的升级行为,该操作在InstallInitialize
之后立即排序。他们有.NET自定义操作,可以执行以下操作:
- 创建事件源
- 将
写入特定注册表路径以供以后使用TARGETDIR
- 调整IIS虚拟目录属性
- 根据在
命令行上传入的安装程序变量,更改已安装的msiexec
文件的内容web.config
web.config
重写逻辑。当最新版本安装在早期版本上时,自定义操作的行为就好像它是代码的早期版本一样,这会在运行时导致错误
我可以在测试中可靠地再现这一点。如果卸载了以前的版本,然后安装了最新的版本,则会执行新的自定义操作代码。但是,如果安装了早期版本,然后安装了最新版本,则执行旧的自定义操作。看起来MSI引擎正在内存中缓存自定义操作程序集,然后对其进行升级,然后运行缓存的副本而不是新副本。在MSI安装日志中,我看到如下条目,这似乎意味着正在进行缓存:
Invoking remote custom action. DLL: C:\Windows\Installer\MSIA101.tmp, Entrypoint: ManagedInstall
显然,解决方法是告诉用户在安装最新版本之前卸载以前的版本,但我想找到更好的解决方案。是否有任何方法可以解决此问题(例如,通过更改安装顺序),或者是MSI引擎中无法更改的固有行为
问题:您对这些自定义操作使用的条件是什么?
在安装项目中,4个自定义操作使用空的
条件
属性定义。在MSI中,安装项目编译器生成了.install
、.commit
和.rollback
自定义操作,条件为$C_uu3fcb03426e0fffae124bde463aabf3e8>2
,以及卸载操作,条件为$C_u3fcb0326e0fffae124bde463aabf3e8=2
。GUID是正在安装的服务exe的组件ID。这些自定义操作使用的条件是什么?它们很可能是从旧安装程序的卸载序列运行的。@SteinÅsmul我已经更新了我的问题。如果你需要更多信息,请告诉我。