WIX Bootstrapper Upgrade - 如何卸载以前的版本静默
WIX Bootstrapper Upgrade - How to uninstall previous version silent
我们有一个 wix 设置(基于 wix 版本 3.9),带有一个标准的 wix 包和一个显示 wpf gui(带有 Bootstrapper 等)的所谓捆绑包,我们可以在其中安装、更新和卸载 沙邦。据我所知,一切都应该是 "by the book"...
现在问题来了:我们可以通过更改版本号来升级,但是我们似乎无法禁止在此过程中弹出卸载 GUI .
我 运行 没有想法,这肯定是其他人已经解决的问题,但我没有找到任何真正的解决方案。
因为它是在 C# 中针对所谓的引擎进行管理的,所以它是我们需要的某种代码。
目前代码是这样的。
在我的 BA class:
中的 运行 方法中
protected override void Run()
{
Dispatcher = Dispatcher.CurrentDispatcher;
var model = new BootstrapperApplicationModel(this);
Logging logging = new Logging(model);
var view = new MainView(model, logging, this.RunMode);
model.SetWindowHandle(view);
this.Engine.Detect();
view.Show();
Dispatcher.Run();
this.Engine.Quit(model.FinalResult);
}
然后在 MainView class(或者实际上是后面的视图模型)作用于此:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging, LaunchAction runMode)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
this.WireUpEventHandlers();
this.OpenStartPageView();
}
private void WireUpEventHandlers()
{
this.model.BootstrapperApplication.PlanComplete += this.PlanComplete;
this.model.BootstrapperApplication.ApplyComplete += this.ApplyComplete;
this.model.BootstrapperApplication.ApplyBegin += this.ApplyBegin;
this.model.BootstrapperApplication.ExecutePackageBegin += this.ExecutePackageBegin;
this.model.BootstrapperApplication.ExecutePackageComplete += this.ExecutePackageComplete;
this.model.BootstrapperApplication.PlanMsiFeature += this.SetPlannedFeature;
this.model.BootstrapperApplication.DetectMsiFeature += SetFeatureDetectedState;
this.model.BootstrapperApplication.DetectRelatedBundle += this.DetectRelatedBundle;
this.model.BootstrapperApplication.DetectPackageComplete += this.DetectPackageComplete;
this.model.BootstrapperApplication.Engine.Detect();
}
希望能给我们一些关于如何设置 gui 的想法。
感觉我需要在 Activate 函数中添加类似下面的附加 if case:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging, LaunchAction runMode)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
if (this.launchAction == LaunchAction.Uninstall && /* something */)
{
this.model.PlanAction(this.launchAction); // Uninstall
return;
}
this.WireUpEventHandlers();
this.OpenStartPageView();
}
但是我不知道如何传递不同版本的信息...
提前致谢!
进行升级时,较新版本的安装将使用 /q 参数 调用先前版本的安装,这将为安装程序 BA Command.Display = Display.None 或 Display.Embedded
因此,在上面的 if-case 示例中,它将如下所示:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging,
LaunchAction runMode, Display display)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
this.displayMode = display;
if (this.launchAction == LaunchAction.Uninstall &&
(this.displayMode == Display.None || this.displayMode == Display.Embedded))
{
this.model.PlanAction(this.launchAction); // Uninstall
return;
}
this.WireUpEventHandlers();
this.OpenStartPageView();
}
解释我在上面做了什么:
- 在函数调用中添加了Display in-parementer
- 扩展 if 以处理 Display.None 和 Display.Embedded
我们有一个 wix 设置(基于 wix 版本 3.9),带有一个标准的 wix 包和一个显示 wpf gui(带有 Bootstrapper 等)的所谓捆绑包,我们可以在其中安装、更新和卸载 沙邦。据我所知,一切都应该是 "by the book"...
现在问题来了:我们可以通过更改版本号来升级,但是我们似乎无法禁止在此过程中弹出卸载 GUI .
我 运行 没有想法,这肯定是其他人已经解决的问题,但我没有找到任何真正的解决方案。
因为它是在 C# 中针对所谓的引擎进行管理的,所以它是我们需要的某种代码。
目前代码是这样的。 在我的 BA class:
中的 运行 方法中 protected override void Run()
{
Dispatcher = Dispatcher.CurrentDispatcher;
var model = new BootstrapperApplicationModel(this);
Logging logging = new Logging(model);
var view = new MainView(model, logging, this.RunMode);
model.SetWindowHandle(view);
this.Engine.Detect();
view.Show();
Dispatcher.Run();
this.Engine.Quit(model.FinalResult);
}
然后在 MainView class(或者实际上是后面的视图模型)作用于此:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging, LaunchAction runMode)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
this.WireUpEventHandlers();
this.OpenStartPageView();
}
private void WireUpEventHandlers()
{
this.model.BootstrapperApplication.PlanComplete += this.PlanComplete;
this.model.BootstrapperApplication.ApplyComplete += this.ApplyComplete;
this.model.BootstrapperApplication.ApplyBegin += this.ApplyBegin;
this.model.BootstrapperApplication.ExecutePackageBegin += this.ExecutePackageBegin;
this.model.BootstrapperApplication.ExecutePackageComplete += this.ExecutePackageComplete;
this.model.BootstrapperApplication.PlanMsiFeature += this.SetPlannedFeature;
this.model.BootstrapperApplication.DetectMsiFeature += SetFeatureDetectedState;
this.model.BootstrapperApplication.DetectRelatedBundle += this.DetectRelatedBundle;
this.model.BootstrapperApplication.DetectPackageComplete += this.DetectPackageComplete;
this.model.BootstrapperApplication.Engine.Detect();
}
希望能给我们一些关于如何设置 gui 的想法。
感觉我需要在 Activate 函数中添加类似下面的附加 if case:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging, LaunchAction runMode)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
if (this.launchAction == LaunchAction.Uninstall && /* something */)
{
this.model.PlanAction(this.launchAction); // Uninstall
return;
}
this.WireUpEventHandlers();
this.OpenStartPageView();
}
但是我不知道如何传递不同版本的信息...
提前致谢!
进行升级时,较新版本的安装将使用 /q 参数 调用先前版本的安装,这将为安装程序 BA Command.Display = Display.None 或 Display.Embedded
因此,在上面的 if-case 示例中,它将如下所示:
public void Activate(BootstrapperApplicationModel appModel, Logging modelLogging,
LaunchAction runMode, Display display)
{
this.launchAction = runMode;
this.model = appModel;
this.logging = modelLogging;
this.displayMode = display;
if (this.launchAction == LaunchAction.Uninstall &&
(this.displayMode == Display.None || this.displayMode == Display.Embedded))
{
this.model.PlanAction(this.launchAction); // Uninstall
return;
}
this.WireUpEventHandlers();
this.OpenStartPageView();
}
解释我在上面做了什么:
- 在函数调用中添加了Display in-parementer
- 扩展 if 以处理 Display.None 和 Display.Embedded