我正在制作一个自定义Bootstrapper
来安装多个MSI,具体取决于用户想要安装的内容。到目前为止一切正常,但我希望能够再次运行安装程序并选择卸载哪个MSI。如果要卸载所有已安装的MSI,则删除捆绑,否则将其保留,以便用户可以添加或删除另一个MSI。
我想在PlanPackageBegin
事件处理程序中执行类似的操作:
if (WisState == State.Uninstalling)
{
if (e.PackageId.Equals("MSI1", StringComparison.Ordinal))
{
if (requestMSI1 == RequestState.Present)
{
e.State = RequestState.None;
}
else
{
e.State = RequestState.Absent;
}
}
}
然后在PlanComplete事件处理程序中我开始:
Bootstrapper.Engine.Apply(System.IntPtr.Zero);
然后捆绑包也会卸载。
如果不是要卸载所有MSI,如何防止卸载我的捆绑包?
答案 0 :(得分:0)
我找到了解决问题的方法。
我没有计划卸载,而是计划修复以防止我的软件包被卸载。要在卸载所有MSI时将其删除,我计划卸载。
if (requestMSI1 == RequestState.Absent && requestMSI2 == RequestState.Absent)
{
this.WisState = State.FullUninstalling;
Bootstrapper.Engine.Plan(LaunchAction.Uninstall);
}
else
{
this.WisState = State.Uninstalling;
Bootstrapper.Engine.Plan(LaunchAction.Repair);
}
然后我检查了PlanPackageBegin
我是否卸载(不是完全卸载):
if (WisState == State.Uninstalling)
{
if (e.PackageId.Equals("MSI1", StringComparison.Ordinal))
{
if (requestMSI1 == RequestState.Absent)
{
e.State = RequestState.Absent;
}
else
{
e.State = RequestState.None;
}
}
else if (e.PackageId.Equals("MSI2", StringComparison.Ordinal))
{
if ("requestMSI" == RequestState.Absent)
{
e.State = RequestState.Absent;
}
else
{
e.State = RequestState.None;
}
}
}
如果我是FullUninstalling,我让Bootstrapper
处理自己的计划。
请注意,WisState和requestMSI1 / 2是我改变的变量,具体取决于我的UI应该显示的内容以及用户的选择。