在所有自定义操作Install Shield之间共享数据的最佳方式

时间:2014-10-09 06:34:21

标签: c# installshield

我们正在使用c#在Install Shield中使用自定义操作,我希望在多个自定义操作之间共享数据。

我已经有了从第一个自定义操作将其写入文本文件的方法,以及从该文件读取值的其他自定义操作。 但由于以下原因,我认为这不是一个好方法。

  1. IO操作成本很高,需要为所有自定义操作完成。
  2. 编写文件可能是特定操作系统的权限问题,因为安装程序将在多个Flavor of Windows操作系统上执行,因此任何不一致都会在安装程序中产生问题。
  3. 所以,我正在寻找可以处理这种情况的最佳实践解决方案..

    期待一些很棒的回复..

2 个答案:

答案 0 :(得分:0)

我们使用2种方法来做到这一点   - 如果我们只需要共享文本数据并且仅在一个安装过程中共享 - 我们使用公共属性。第一个CA设置属性,其他CA读取此数据。 MsiSetPropertyMsiGetProperty会帮助您,但不要忘记Accessing or Setting Windows Installer Properties Through Deferred, Commit, and Rollback Custom Actions   - 如果需要在不同的安装过程之间共享数据 - 我们使用注册表和系统搜索。第一个安装程序将数据写入注册表中的某个位置 - 其他安装程序在系统搜索的帮助下读取它并设置适当的属性。

答案 1 :(得分:0)

据我所知,理论是立即行动可以确切地确定与之相关的后续行动需要知道什么,因此可以根据需要为后续行动设置属性或CustomActionData。属性可以存储您可以在零终止字符串中表示的任何序列化格式。这是Windows Installer真正支持的一种机制,用于在即时操作之间进行通信,尤其是延迟操作。

然而在实践中,这并不总是正常的。有时,读取机器的当前状态需要立即操作不可用的管理权限。有时为了运行有效的回滚或提交操作,您需要知道在进行更改的高架尝试期间发生了什么。即使在没有提升特权的情况下收集信息也是如此,可能很难提前计划这一点,并且很容易在易用性和理论正确性之间进行权衡。

通过属性机制共享文件名并在您描述时更新共享文件并不罕见。核心差异是文件名不是预先确定的;它存储在%TEMP%或类似物中,其名称通过属性进行通信。这解决了提升问题,但不一定是安全问题。