将动态属性传递给延迟的自定义操作 WIX
Posted
技术标签:
【中文标题】将动态属性传递给延迟的自定义操作 WIX【英文标题】:Passing Dynamic Properties to Deferred Custom Actions WIX 【发布时间】:2018-05-05 16:52:04 【问题描述】:我想将安装目录传递给我的不同自定义操作。我有财产
<Property Id="CA1Action" Value="InstallDir=[INSTALLFOLDER]"/>
然后我在 Wix 中定义了一个 CA
<CustomAction Id="CA1Action"
BinaryKey="InstallerActionsBinary"
DllEntry="CA1"
Execute="commit"
Return="check" />
为了完成,我将我的 CA 称为
<Custom Action="CA1Action" After="InstallFiles"></Custom>
使用 MSIEXEC 执行我的安装程序时,我从尝试从安装中打开文件的自定义操作中收到以下错误消息:
找不到文件“C:\Windows\Installer\MSICA8C.tmp-\C:\Program Files\MyProgram\web.config”。
这是我从会话中提取信息的方式:
public static ActionResult CA1(Session session_)
//Collect parameters from Session
CustomActionData data = session_.CustomActionData;
string path = data["InstallDir"];
我的第一个问题是为什么安装程序的缓存添加到我的参数中?为了进一步增加我的困惑,当我添加时
path = path.Substring("C:\Windows\Installer\MSICA8C.tmp-\".Length);
到我的 CA 删除“C:\Windows\Installer\MSICA8C.tmp-\”,我得到一个参数异常,告诉我子字符串的起始值高于我的字符串的长度..所以我添加了登录到我的 CA,并且看到路径设置为“[INSTALLFOLDER]”,而不是属性的值,但是当我在 FileStream 的路径中使用它时,它的属性值如何?
我正在关注这篇文章中的回复:How to pass parameters to the custom action?
【问题讨论】:
为什么这个编辑说不一样?只有一个 CA 有问题。它们是延迟操作。不一样。 详细日志文件对 CA1Action 的值表示什么?在我看来,它应该包含文字方括号,因为您是在前面定义它的值,而不是通过 set-property 自定义操作(如您所指问题的答案所示)。 【参考方案1】:不清楚您为什么要使用提交自定义操作,然后在 InstallFiles 之后对其进行排序。 Commit Custom Actions 在 InstallFinalize 之后运行。很可能你应该有一个延迟的自定义操作。
另一个问题是,使用包含 [INSTALLFOLDER] 的值定义名为 CA1Action 的属性不太可能起作用,因为直到任何 UI 或其他设置其值的自定义操作之后才定义 [INSTALLFOLDER]。您需要的是一个明确的“设置属性”自定义操作,该操作在您的实际自定义操作调用之前排序。您链接到的示例有一个名为 SetDirProp。
因此,您可能会看到安装程序缓存文件夹,因为这些值未正确初始化,或者因为您处于提交阶段。无论如何,您可能会看到意外的位置,因为二进制文件将被流式传输到可以从中运行的某个位置,因此可以使用 tmp 或安装程序缓存位置,但无论哪种方式,它都是与框架决定的位置相关的实现细节流向。
【讨论】:
谢谢。我之前曾尝试添加自定义操作来设置属性,但我只是使用 value="[INSTALLFOLDER],而我需要 Value="InstallDir=[INSTALLFOLDER]"以上是关于将动态属性传递给延迟的自定义操作 WIX的主要内容,如果未能解决你的问题,请参考以下文章