Wix自定义操作-会话为空并且延迟操作时出错

时间:2019-01-21 07:19:15

标签: wix windows-installer wix3.11

我正在将Wix 3.11.1与VS2017扩展一起使用。我从自定义对话框的控件中设置了一个属性,然后尝试执行立即自定义操作。当我尝试读取会话时,它始终为空。

根据建议,我将动作更改为不同的执行方式,并使用立即动作来设置我的属性。当我运行安装程序时,出现错误:“调试:错误2896:执行操作[ActionName]失败。”

在CustomDialog.wxs

<Control Id="ConnId" Type="Edit" X="60" Y="110"  Height="17" Width="300" Property="CONN"/>

<Control Id="installButton" Type="PushButton" Text="Continue" Height="15" Width="60" X="240" Y="260">
      <Publish Event="DoAction" Value="RegistrationInfoCustomAction">1</Publish>
      <Publish Event="EndDialog" Value="Return">1</Publish>
    </Control>

<Fragment>
<Binary Id="CustomActionBinary" SourceFile="..\..\CustomActions\bin\Debug\CustomActions.CA.dll"/>
<CustomAction Id="SetPropertyForShowProperty" Property="RegistrationInfoCustomAction" Execute="immediate" Value="[CONN]" Return="check" />
<CustomAction Id="RegistrationInfoCustomAction" BinaryKey="CustomActionBinary" DllEntry="SaveUserInfo" Execute="deferred" Return="check" HideTarget="no"/>
</Fragment>

在Product.wxs中

<InstallExecuteSequence>
<Custom Action="SetPropertyForShowProperty" After="InstallInitialize"/>
<Custom Action="RegistrationInfoCustomAction" Before="InstallFinalize"/>
</InstallExecuteSequence>

在CustomActions.cs

[CustomAction]
    public static ActionResult SaveUserInfo(Session session)
    {
        Debugger.Launch();
        CustomActionData data = session.CustomActionData;

        session.Log("Begin SaveUserInfo");
        var connectionString = data["CONN"];
        session.Log($"content: {connectionString}");

        session.Log("End SaveUserInfo");
        return ActionResult.Success;
    }

当自定义操作仅包含日志记录语句,但添加任何其他代码会使它失败时,它将起作用。此外,会话始终为空。

在安装程序日志中:

MSI(c)(88:34)[16:30:21:255]:调用远程自定义操作。 DLL:C:\ Users \ Andre \ AppData \ Local \ Temp \ MSIF1A3.tmp,入口点:SaveUserInfo

MSI(c)(88:F8)[16:30:21:256]:启用了隐藏。

MSI(c)(88:F8)[16:30:21:256]:尝试在调用服务器上的安装之前启用所有禁用的特权

MSI(c)(88:F8)[16:30:21:256]:已连接到CA接口服务。

操作已结束16:30:41:RegistrationInfoCustomAction。返回值3。

调试:错误2896:执行操作RegistrationInfoCustomAction失败。

安装程序在安装此软件包时遇到意外错误。这可能表明此程序包有问题。错误代码为2896。 参数为:RegistrationInfoCustomAction, 动作结束于16:30:41:SetupDialog。返回值3。 MSI(c)(88:8C)[16:30:41:911]:正在执行操作:FatalError

1 个答案:

答案 0 :(得分:0)

  

UPDATE :已经很晚了,我没有看到第一眼的印象,但是只能通过设置GUI运行即时模式自定义操作。进行新的立即模式自定义操作,以将值设置为PUBLIC属性CONN,然后通过类型51自定义操作来设置CONN的值,以将其分配给延迟模式自定义操作的ID,如下所述。


  

SecureCustomProperties :通过设置Secure =“ yes”属性将指定的属性添加到SecureCustomProperties:

<Property Id="MYPROPERTY" Secure="yes">Send this text to deferred mode</Property>

  

名称匹配 :您分配值的属性名称必须与延迟模式自定义操作 Id 相匹配。在您的来源中看起来还可以。

更多技术 the Property attribute's value中的type 51 action必须与消耗CustomActionData的自定义操作的ID相同:

<!-- Declare property with value -->
<Property Id="MYPROPERTY" Secure="yes">Send this text to deferred mode</Property>

<!-- Type 51 CA: Send value of MYPROPERTY to the deferred mode CA named MyAction -->
<CustomAction Id="MyAction.SetProperty" Return="check" Property="MyAction" Value="[MYPROPERTY]" />

<!-- The deferred mode custom action -->
<CustomAction Id="MyAction" Return="check" Execute="deferred" BinaryKey="CAs" DllEntry="MyAction" />

<!-- ... -->

<!-- Inserting the CAs in sequence -->
<InstallExecuteSequence>
    <Custom Action="MyAction.SetProperty" After="InstallInitialize" />
    <Custom Action="MyAction" Before="InstallFinalize" />
</InstallExecuteSequence>

以下是一些资源:


Just for debugging reference。您可以使用:string data = session["CustomActionData"];


告诉您什么,让我滑动代码以使用VBScript进行测试,以便可以使用消息框。万一您遇到调试问题,则不必这样做:

VBScript "Simple.vbs"(另存为文件):

MsgBox Session.Property("CustomActionData")

WiX标记更改

<Binary Id='Simple.vbs' SourceFile='Simple.vbs' />
<CustomAction Id="MyAction" Return="check" Execute="deferred" BinaryKey="Simple.vbs" VBScriptCall='' />

以防万一。建议您将VBScript仅用于调试。当我想消除所有其他错误源时,我希望VBScript获得“ heartbeat”。