我有两个功能:
<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,则安装程序将起作用。
答案 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;
}
}