WiX Toolset在文件复制后运行自定义操作

时间:2016-07-06 18:46:58

标签: wix

我在C#自定义操作程序集中有自定义操作,我想在安装结束时运行,或者至少在复制文件之后运行。我需要使用在安装的第一部分期间在对话框中输入的信息更新配置文件。它是一个远程配置文件,因此有几行必须更新。目前我有每个订单项的XmlFile条目,但我想一般用[servername]:[serverport]替换localhost:8001。我没有在WiX中找到通用搜索和替换,因此我编写了一个自定义操作来执行此操作。问题是我无法让它运行。我正在使用自定义UI(UI Sequence XML bellow),这可能就是为什么After =" InstallFiles"不起作用。

    <InstallUISequence>
        <Custom Action="SetInstallFolder" Sequence="1" />
        <!--<Custom Action="UpdateRemotingConfigFile" After='InstallFiles' />-->
        <Show Dialog="UserExitForm" OnExit="cancel" />
        <Show Dialog="FatalErrorForm" OnExit="error"><![CDATA[NOT HideFatalErrorForm]]></Show>
        <Show Dialog="MaintenanceForm" Sequence="999"><![CDATA[Installed <> ""]]></Show>
        <Show Dialog="ResumeForm" Sequence="998"><![CDATA[Installed="" AND RESUME]]></Show>
        <Show Dialog="FinishedForm" OnExit="success" />
        <Show Dialog="WelcomeForm" Sequence="1001"><![CDATA[Installed="" AND NOT RESUME]]></Show>
        <Custom Action="VSDCA_AllUsers" After="CostInitialize"><![CDATA[Installed="" AND NOT RESUME AND ALLUSERS=1]]></Custom>
    </InstallUISequence>

    <AdminUISequence>
        <Custom Action="SetInstallFolder" Sequence="1" />
        <!--<Custom Action="UpdateRemotingConfigFile" After='InstallFiles' />-->
        <Show Dialog="UserExitForm" OnExit="cancel" />
        <Show Dialog="FatalErrorForm" OnExit="error"><![CDATA[NOT HideFatalErrorForm]]></Show>
        <Show Dialog="MaintenanceForm" Sequence="999"><![CDATA[Installed<>""]]></Show>
        <Show Dialog="ResumeForm" Sequence="998"><![CDATA[Installed="" AND RESUME]]></Show>
        <Show Dialog="FinishedForm" OnExit="success" />
        <Show Dialog="WelcomeForm" Sequence="1001"><![CDATA[Installed="" AND NOT RESUME]]></Show>
    </AdminUISequence>

如果我取消注释上面的自定义操作,我会收到以下错误:

  

错误LGHT0094:未解析的符号引用&#39; WixAction:InstallUISequence / InstallFiles&#39;在部分&#39;产品:{...

如果我将其更改为&#34; FinishedForm&#34;,我会收到以下错误:

  

错误LGHT0177:AdminUISequence表包含一个操作&#39; UpdateRemotingConfigFile&#39;计划在行动之前或之后的FinishedForm&#39;,这是一项仅在安装程序终止时才会发生的特殊操作。这些特殊动作可以通过它们的负序号来识别。请安排行动&#39; UpdateRemotingConfigFile&#39;在不同的行动之前或之后来。

更新 我的自定义操作定义如下:

<Binary Id="WebApiSetupHelper" SourceFile="..\WebApiSetupHelper\bin\$(var.Configuration)\WebApiSetupHelper.CA.dll" />
<CustomAction Id="UpdateRemotingConfigFile" BinaryKey="WebApiSetupHelper" DllEntry="UpdateRemotingConfigFile" Return="check" />

我需要更改哪些内容才能运行自定义操作?

感谢。

1 个答案:

答案 0 :(得分:0)

每个安装分为两部分。第一个是UI部分(InstallUISequence和AdminUISequence)以及安装程序运行安装脚本以将所有文件放在适当位置的执行部分(单击安装后)。这些序列是InstallExecuteSequence和AdminExecuteSequence。

对于绝大多数安装,我认为您不需要使用AdminUISequence和AdminExecuteSequence。

您需要做的是在InstallExecuteSequence中安排自定义操作。由于您正在修改文件的内容,因此您必须延迟此自定义操作,以便您具有提升的权限并可以修改安全位置中的文件(例如,如果您要修改程序文件位置中的文件)。

如果在延迟的自定义操作中需要安装的UI部分中的属性值,则需要使用特殊模式以自定义操作可以读取的方式保存值。

您需要在表单中使用自定义操作:

<CustomAction Id="SetUpdatingRemotingConfigFile" Property="UpdateRemotingConfigFile" Value="ServerName=[ServerName];ServerPort=[ServerPort]" />

非常重要的是,该属性与将访问Value中定义的属性的自定义操作ID的名称完全相同。将此操作安排为Before =“UpdateRemotingConfigFile”,以便在运行需要它们的自定义操作之前设置值。

现在,您需要更新自定义操作

string ServerName = session["ServerName"];

string ServerName = session.CustomActionData["ServerName"];

然后您应该能够在自定义操作中加载在安装的UI部分期间设置的这些属性的值,并修改该配置文件的内容。