WiX - 提交多个属性到延迟自定义操作

9

我有一个问题,关于WiX安装程序和延迟/立即自定义操作的联系。请原谅我的英语。

我想将用户输入的一些属性传递给延迟自定义操作。我知道我需要一个立即自定义操作和“CustomActionData”来实现这一点。我已经按照以下方式实现了它:

二进制文件:

<Binary Id='myAction'  SourceFile='.\TemplateGeneration.CA.dll'/>

直接自定义操作:

<CustomAction Id='Datenuebergabe' Property='DoSomething' Value='InstalllocVar=[INSTALLLOCATION]'/>

延迟自定义操作:
<CustomAction Id='TemplateGenerationInstallKey' BinaryKey ='myAction' DllEntry='DoSomething' Impersonate='no' Execute='deferred'  Return='check' HideTarget='yes'/>

安装执行序列(InstallExecuteSequence)
 <InstallExecuteSequence>

  <Custom Action="Datenuebergabe" Sequence="1399"/>
  <Custom Action="TemplateGenerationInstallKey" Before="InstallFinalize"/>

 </InstallExecuteSequence>

在延迟自定义操作中调用属性:
string somedata = session.CustomActionData["InstalllocVar"];
TemplateEngineCall(somedata+"templates", "install_key_cmd", somedata+"scripts", "install_key.cmd");

我的问题: 如果我尝试安装我的程序,它就会崩溃。 使用这段代码,我只能提交一个属性,但我需要提交多个。

有关信息: 当我查看日志文件时,在自定义操作调用期间出现了System.Collections.Generic.KeyNotFoundException。

为什么不起作用? 嗯,我需要延迟自定义操作来写入“程序文件夹”。由于需要权限,所以需要延迟自定义操作,并且在延迟之前执行的立即自定义操作应该有助于处理属性。这是否可能?

我希望你理解我的问题,并可能尝试帮助我。

1个回答

19
首先,你在将数据从立即自定义操作传递到延迟的自定义操作时存在错误。你在立即自定义操作中使用的“Property”名称必须与延迟自定义操作的“Id”完全相同。在你的情况下:
<!-- immediate CA -->
<CustomAction Id='Datenuebergabe' Property='DoSomething' Value='InstalllocVar=[INSTALLLOCATION]'/>

<!-- deferred CA -->
<CustomAction Id='DoSomething' BinaryKey ='myAction' DllEntry='DoSomething' Impersonate='no' Execute='deferred'  Return='check' HideTarget='yes'/>

这将解决KeyNotFound异常的问题。

现在,回到你的问题,如何传递多个值。

首先,在立即CA中使用;分隔符来传递名称-值集合,像这样:

<CustomAction Id="SetForDoSomething" Return="check" Property="DoSomething" Value="source=[ArchiveFolder][ARCHIVENAME];target=[WebsiteFolder]"/>

正如您所看到的,我们在这里向延迟的CA传递了2个名称-值对,即sourcetarget。 在延迟的CA中,请使用以下代码将这些值取出:

var source = session.CustomActionData["source"];
var target = session.CustomActionData["target"];

就是这样了。


谢谢,这很有道理,目前看起来它确实有效。但是我需要在哪个顺序中调用立即自定义操作,以便在安装文件后启动它?有没有一种方法可以实现这一点? - Schneckschjen
安装文件后无法立即执行操作。这就是为什么它被称为“立即” - 当Windows Installer代理在处理时到达它时,它会立即执行。立即CA旨在从系统、环境和用户收集信息,可选地验证并将其传递给延迟序列以进行实际执行。立即CA绝不能更改目标系统状态。 - Yan Sklyarenko
然后就是延迟操作了,需要安装模板的文件找不到了... 嗯... - Schneckschjen
@YanSklyarenko 如何从CustomAction将值发送回Wix<Property Id="RESTART" Secure="yes" Value="false" /> - asvignesh
1
@asvignesh,我认为这个问题值得单独提出来,因为它不在这个问题的范围之内。 - Yan Sklyarenko
@YanSklyarenko https://dev59.com/waTia4cB1Zd3GeqP8x97 - asvignesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接