INSTALLLEVEL不安装功能

时间:2011-12-09 20:48:11

标签: c# windows installer wix windows-installer

我有两个功能:

    <Feature Id='BaseProductFeatures' Title='Feature 1' Level='1'>
        <ComponentRef Id='WebAppVDirComponent'/>
        <ComponentRef Id='someVDirComponent'/>
        <ComponentRef Id='anotherWCFVDirComponent'/>
        <ComponentGroupRef Id='group_IMPORTFOLDERFILES'/>
        <ComponentGroupRef Id='group_WINSERVERFILES'/>
    </Feature>

    <Feature Id='SMSGWFeature' Title='Feature 2' Level='2'>
        <ComponentGroupRef Id='group_SMSGWWEBAPPFILES'/>
    </Feature>

在安装之前,我使用自定义操作将INSTALLLEVEL更改为2:

    [CustomAction]
    public static ActionResult ChangeInstallLevel(Session session) {
        session["INSTALLLEVEL"] = "2";
        return ActionResult.Success;
    }

值已设置,但未安装功能2(SMSGWFeature)。这是为什么?我没有看到ComponentGroupRef中的任何组件,group_SMSGWWEBAPPFILES安装在我希望看到它们的目录中。但是如果我将功能级别2(SMSGWFeature)设置为1,则安装程序将起作用。

2 个答案:

答案 0 :(得分:2)

确保在InstallValidate中的InstallExecuteSequence操作之前执行自定义操作。在InstallValidate之后设置INSTALLLEVEL并不会影响任何事情。

此外,verbose installation log极大地帮助确定是否以及为何未安装功能或组件。只需在日志中搜索InstallValidate,然后检查功能和组件状态并安装操作。

答案 1 :(得分:0)

好吧,日志文件没有说什么,我在InstallValidate之前设置了INSTALLLEVEL(我在安装之前在用户界面中设置它)。至于开销,这一切都在这台慢速机器上快速发生,但又一次是我在下一次按钮点击时在UI中使用的自定义动作。但我发现了问题是什么以及如何解决它。

参考this link,从UI更改INSTALLLEVEL为时已晚,因为在CostFinalize标准操作下会考虑INSTALLLEVEL,并且在我有时间允许之前执行CostFinalize标准操作用户选择他的功能并调用我的动作。 Cosmin,我不认为INSTALLLEVEL在InstallValidate之前很重要,它似乎要早得多,在这种情况下它在CostFinalize之前就会被考虑在内。

我必须做的事情如下......

我改变了我的第二个功能以允许它不存在:

<Feature Id='BaseProductFeatures' Title='Feature 1' Level='1'>
    <ComponentRef Id='WebAppVDirComponent'/>
    <ComponentRef Id='someVDirComponent'/>
    <ComponentRef Id='anotherWCFVDirComponent'/>
    <ComponentGroupRef Id='group_IMPORTFOLDERFILES'/>
    <ComponentGroupRef Id='group_WINSERVERFILES'/>
</Feature>

<Feature Id='SMSGWFeature' Title='Feature 2' Level='2' Absent='allow'>
    <ComponentGroupRef Id='group_SMSGWWEBAPPFILES'/>
</Feature>

我将自定义操作更改为启用或禁用该功能:

foreach (FeatureInfo aFeature in session.Features) {
    if (session["INSTALLSMSGATEWAYSERVICE"] == "" && aFeature.Name == "SMSGWFeature") {
        aFeature.RequestState = Microsoft.Deployment.WindowsInstaller.InstallState.Absent;
    }
    else if (session["INSTALLSMSGATEWAYSERVICE"] == "1" && aFeature.Name == "SMSGWFeature") {
        aFeature.RequestState = Microsoft.Deployment.WindowsInstaller.InstallState.Local;
    }
}