我想将安装目录传递给我的不同自定义操作。我有财产
<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?
答案 0 :(得分:1)
目前尚不清楚为什么要使用提交自定义操作,然后在InstallFiles之后对其进行排序。 Commit Custom Actions在InstallFinalize之后运行。很可能你应该只有一个延迟的自定义动作。
另一个问题是定义一个名为CA1Action的属性,其值包含[INSTALLFOLDER]是不可能的,因为[INSTALLFOLDER]在任何UI或其他自定义操作设置之后才定义值。你需要的是一个明确的&#34;设置属性&#34;在您的实际自定义操作调用之前排序的自定义操作。您链接到的示例有一个名为SetDirProp。
因此,您可能会看到安装程序缓存文件夹,因为这些值未正确初始化,或者因为您处于提交阶段。无论如何,您可能会看到意外的位置,因为二进制文件将流式传输到可以从中运行的某个位置,因此可以使用tmp或安装程序缓存位置,但无论哪种方式,它都是与任何位置相关的实现细节框架决定流式传输。