将动态属性传递给延迟的自定义操作 WIX

Passing Dynamic Properties to Deferred Custom Actions WIX

我想将安装目录传递给我的不同自定义操作。我有 属性

<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 执行我的安装程序时,我从尝试从安装中打开文件的自定义操作中收到以下错误消息:

Could not find file '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 的路径中使用它时 属性 的值如何?

我正在关注此 post 中的回复:How to pass parameters to the custom action?

不清楚为什么要使用提交自定义操作然后在 InstallFiles 之后对其进行排序。 Commit Custom Actions 运行 安装完成后。很可能你应该有一个延迟的自定义操作。

另一个问题是用包含 [INSTALLFOLDER] 的值定义一个名为 CA1Action 的 属性 不太可能起作用,因为 [INSTALLFOLDER] 直到任何 UI 或设置其值的其他自定义操作。您需要的是一个明确的 "set property" 自定义操作,它在您的实际自定义操作调用之前进行排序。您 link 的示例有一个名为 SetDirProp 的示例。

所以您看到安装程序缓存文件夹的原因可能是值未正确初始化,或者您正处于提交阶段。无论如何,您可能会看到意想不到的位置,因为二进制文件将被流式传输到某个位置,它可能来自 运行,因此 tmp 或安装程序缓存位置是可能的,但无论哪种方式,它都是与任何地方相关的实现细节框架决定流向。