在所有自定义操作之间共享数据的最佳方式Install Shield
本文关键字:最佳 方式 Install Shield 数据 共享 自定义 操作 之间 | 更新日期: 2023-09-27 18:25:58
我们在带有c#的Install-Shield中使用自定义操作,我想在多个自定义操作之间共享一个数据。
我已经有了一种方法,可以从第一个自定义操作将其写入文本文件,对于其他自定义操作,可以从该文件读取值。。但我觉得这不是一个好方法,原因如下。
- IO操作成本高昂,所有自定义操作都需要进行IO操作
- 写入文件可能是特定操作系统的权限问题,因为安装程序将在多种风格的Windows操作系统上执行,所以任何不一致都会在安装程序中产生问题
因此,我正在寻找能够处理这种情况的最佳实践解决方案。。
期待一些精彩的回复。。
我们使用两种方法来实现
-如果我们只需要在一个安装过程中共享文本数据,我们使用公共属性。第一个CA设置属性,其他CA读取这些数据。MsiSetProperty和MsiGetProperty将在这里为您提供帮助,但不要忘记通过延迟、提交和回滚自定义操作访问或设置Windows安装程序属性
-如果需要在不同的安装过程之间共享数据,我们使用注册表和系统搜索。第一个安装程序将数据写入注册表中的某个位置,其他安装程序在系统搜索的帮助下读取数据并设置适当的属性。
据我所知,理论上即时操作可以准确地确定与之相关的后续操作需要知道什么,因此可以根据需要为这些后续操作设置属性或CustomActionData。属性可以存储您可以在以零结尾的字符串中表示的任何序列化格式。这是Windows安装程序真正支持的一种机制,用于在即时操作之间进行通信,尤其是对延迟操作。
然而,在实践中,这并不总是正确的。有时读取机器的当前状态需要管理权限,而这些权限对于立即操作是不可用的。有时,为了运行有效的回滚或提交操作,您需要知道在进行更改的提升尝试过程中发生了什么。即使在没有特权的情况下可以收集信息,也很难提前计划,而且很容易在轻松和理论正确之间进行权衡。
通过属性机制共享文件名并根据您的描述更新共享文件并不罕见。核心区别在于文件名不是预先确定的;它存储在%TEMP%或类似文件中,其名称通过属性进行通信。这解决了提升问题,但不一定解决了安全问题。