将动态属性传递给延迟的自定义操作 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在wix中将属性传递给回滚自定义操作?

wix 自定义操作,管理员组

WIX 中功能的自定义操作

Wix延迟自定义操作访问被拒绝

如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?

WIX 自定义操作参数中的连接字符串