我的WiX安装程序在联系延迟/即时自定义操作时遇到问题。请原谅我的英语。
我想将用户输入的某些属给延迟的自定义操作。我知道我需要立即自定义操作和"自定义操作数据"来执行此操作。我已经以这种方式实现了它。
二进制文件:
<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>
<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。
为什么这不起作用?好吧,我需要延迟的自定义操作才能写入"程序文件文件夹"。由于需要权限,因此需要延迟的自定义操作,并且在延迟之前执行的即时自定义操作应有助于处理属性。有可能做到吗?
我希望你明白我的问题是什么,你可以尝试帮助我。
首先,将数据从即时自定义操作传递到延迟操作的方式存在错误。在即时自定义操作中使用的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
异常的问题。
现在,回到您的问题如何传递超过 1 个值。
首先,在直接 CA 中使用;
分隔符传递名称-值集合,如下所示:
<CustomAction Id="SetForDoSomething" Return="check" Property="DoSomething" Value="source=[ArchiveFolder][ARCHIVENAME];target=[WebsiteFolder]"/>
如您所见,我们在此处将 2 个名称-值对传递给延迟的 CA,source
和 target
。在延迟 CA 中,使用以下代码提取这些值:
var source = session.CustomActionData["source"];
var target = session.CustomActionData["target"];
仅此而已。