我需要将数据从一个延迟的.NET自定义操作传递到另一个,但我无法弄清楚如何执行此操作。
延迟的自定义操作无法访问Windows Installer会话,因此不能选择会话属性。目标延迟自定义操作已经采用从早期直接自定义操作设置的自定义操作数据,但我似乎无法从源延迟操作中修改此操作。
我也尝试在自定义操作类上使用静态属性,但正如预期的那样,这也不起作用。
我可以在源操作中写入注册表并在目标操作中将其读回,但这看起来有点hacky。当然,有一种更标准的方法可以在延迟的自定义操作之间传递数据吗?
答案 0 :(得分:5)
是的,好问题。
当然,有一种更标准的方法可以在延迟之间传递数据 自定义操作?
不,据我所知,没有这样的标准系统。
说实话,延迟操作可以通过CustomActionData
读取属性已经很奇迹 - 在生成执行脚本时通过某种元数据完成了这些操作。延迟操作只能访问少数有限的属性,它无法与MSI数据库进行交互。
有关详情,请参阅Obtaining Context Information for Deferred Execution Custom Actions。它不是WiX限制,而是MSI。
正如你所说,无论是查看临时文件夹还是注册表 - 虽然不一定方便或不好 - 如果仔细完成,它会很好用。
如果您有兴趣了解有关MSI架构的更多信息,这是非常好的链接:http://bonemanblog.blogspot.co.uk/2005/10/custom-action-tutorial-part-i-custom.html
答案 1 :(得分:1)
故意没有办法做到这一点,因为这不是设计意图。目的是立即执行自定义操作以执行所有业务逻辑/数据处理,并将指令数据传递给执行实际提升的工作/系统更改的延迟自定义操作。
答案 2 :(得分:0)
WiX提供了一个本机代码库,用于在wcautil.lib中执行此操作。见https://github.com/wixtoolset/wix3/blob/develop/src/libs/wcautil/wcascript.cpp。 (我们需要它来进行IIS自定义操作,因为IIS打破了"规则"标准用户应该能够读取配置,如果不写的话。)