我在wix包中有2个msi我正在使用wix 3.7的自定义引导程序。我的安装,卸载和取消命令完美无缺。当我尝试使用以下命令从bundle中添加/删除msi的功能时:
this.ModifyCommand = new DelegateCommand(() => this.model.PlanAction(LaunchAction.Modify), () => this.state == InstallState.Present);
它没有按预期工作。我使用下面的代码来检测包
protected void DetectPackageComplete(object sender,DetectPackageCompleteEventArgs e)
{
//System.Diagnostics.Debugger.Launch();
if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal))
{
this.State = e.State == PackageState.Present ? InstallState.Present : InstallState.NotPresent;
this.model.LogMessage("Setup1.msi"+this.State.ToString());
}
if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal))
{
this.State = e.State == PackageState.Present ? InstallState.Present : InstallState.NotPresent;
this.model.LogMessage("Setup2.msi" + this.State.ToString());
}
}
全新安装后,我的UI显示添加/删除,删除,修复,重新安装以供下次安装的选项,我可以从我的软件包卸载单个msi,但下次它没有检测到剩余的软件包。
如果我取消安装setup2.msi它会显示添加/删除屏幕,但修改按钮是禁用的,如果我卸载setup1.msi则要求全新安装。
答案 0 :(得分:0)
最后我解决了这个问题,我不知道这是对还是错,但是在我实施它的时候,它对我来说很好。
这是代码
在manged BA中添加以下事件
private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e)
{
if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal))
{
this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State);
string IsSetup1= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup1"];
if (IsSetup1== "True")
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.Absent;
}
this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State);
}
if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal))
{
this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State);
string IsSetup2= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup2"];
if (IsSetup2== "True")
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.Absent;
}
this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State);
}
}
将以下行添加到WireUpEventHandlers()函数
this.model.BootstrapperApplication.PlanPackageBegin +=this.PlanPackageBegin;
此处chkSetup1和chkSetup2值从为特征树和SetBurnVariable函数制作的自定义UI设置为True或False。
我希望它会帮助一些人。
答案 1 :(得分:-1)
最后我解决了这个问题,我不知道这是对还是错,但是在我实施它的时候,它对我来说很好。
这是manged BA中的事件后面的代码
private void PlanPackageBegin(object sender, PlanPackageBeginEventArgs e)
{
if (e.PackageId.Equals("Setup1.msi", StringComparison.Ordinal))
{
this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State);
string IsSetup1= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup1"];
if (IsSetup1== "True")
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.Absent;
}
this.model.LogMessage("PlanPackageBegin Setup1 : " + e.State);
}
if (e.PackageId.Equals("Setup2.msi", StringComparison.Ordinal))
{
this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State);
string IsSetup2= this.model.BootstrapperApplication.Engine.StringVariables["chkSetup2"];
if (IsSetup2== "True")
{
e.State = RequestState.Present;
}
else
{
e.State = RequestState.Absent;
}
this.model.LogMessage("PlanPackageBegin Setup2 : " + e.State);
}
}
将以下行添加到WireUpEventHandlers()函数
this.model.BootstrapperApplication.PlanPackageBegin +=this.PlanPackageBegin;
此处chkSetup1和chkSetup2值从为特征树和SetBurnVariable函数制作的自定义UI设置为True或False。 我希望它会帮助一些人。