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

时间:2018-05-05 16:52:05

标签: c# wix windows-installer custom-action

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

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

  

无法找到文件&#39; C:\ Windows \ Installer \ MSICA8C.tmp- \ C:\ Program Files \ MyProgram \ web.config&#39;。

以下是我从会话中提取信息的方式:

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删除&#34; C:\ Windows \ Installer \ MSICA8C.tmp - \&#34;,我得到一个参数异常,告诉我子字符串的起始值高于我的长度字符串..所以我添加了日志记录到我的CA,并且看到该路径被设置为&#39; [INSTALLFOLDER]&#39;,而不是属性的值,但那么它是如何属性的值我在FileStream的路径中使用它?

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

1 个答案:

答案 0 :(得分:1)

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

另一个问题是定义一个名为CA1Action的属性,其值包含[INSTALLFOLDER]是不可能的,因为[INSTALLFOLDER]在任何UI或其他自定义操作设置之后才定义值。你需要的是一个明确的&#34;设置属性&#34;在您的实际自定义操作调用之前排序的自定义操作。您链接到的示例有一个名为SetDirProp。

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