无法从另一个托管引导程序应用程序卸载 WiX 托管引导程序应用程序

Posted

技术标签:

【中文标题】无法从另一个托管引导程序应用程序卸载 WiX 托管引导程序应用程序【英文标题】:Unable to Uninstall WiX Managed Bootstrapper application from another Managed Bootstrapper Application 【发布时间】:2017-05-19 12:51:11 【问题描述】:

我有自己的托管引导程序应用程序,使用 WiX 工具集开发并使用 MVVM 模式用 c# 编写。由于这是一个托管引导程序应用程序,我也有一个自定义 UI。我的 Bundle.wxs 代码如下

<Bundle Name="NestleMESSetup"
          Version="!(bind.packageVersion.NestleCustomLayerSetupPackage)"
          Manufacturer="CT Infotech"
              UpgradeCode="CCBB8D5B-8171-47FB-AD53-25C6E866C34E"
              Copyright="Copyright© 2017 CT Infotech ALL RIGHTS RESERVED"
              SplashScreenSourceFile="Resources\Splash.bmp"
              IconSourceFile="Resources\menu.ico">

        <Variable Name="KambanVersion" Type="version" Value="!(bind.packageVersion.KambanFASSetup)"/>

        <BootstrapperApplicationRef Id="ManagedBootstrapperApplicationHost">
          <PayloadGroupRef Id="InstallerPayload"/>
        </BootstrapperApplicationRef>

        <util:RegistrySearchRef Id='SearchForKamban' />

        <Chain>
          <PackageGroupRef Id="InstallerPackages"/>
        </Chain>

        <Variable Name="DbName" bal:Overridable="yes" />
        <Variable Name="SqlInstance" bal:Overridable="yes" />
        <Variable Name="InstallPath" bal:Overridable="yes" />
        <Variable Name="Roles" bal:Overridable="yes" />
        <Variable Name="Modules" bal:Overridable="yes" />
        <Variable Name="CustomInstall" bal:Overridable="yes"/>

        <WixVariable Id="WixMbaPrereqPackageId" Value="Netfx4Full" />
        <WixVariable Id="WixMbaPrereqLicenseUrl" Value="NetfxLicense.rtf" />

      </Bundle>

      <Fragment>
        <PayloadGroup Id="InstallerPayload">
          <Payload SourceFile="..\Nestle.MES.Bootstrapper.UI\BootstrapperCore.config"/>
          <Payload SourceFile="..\Nestle.MES.Bootstrapper.UI\bin\$(var.Configuration)\Nestle.MES.Bootstrapper.UI.dll"/>
          <Payload SourceFile="C:\Program Files (x86)\WiX Toolset v3.10\SDK\Microsoft.Deployment.WindowsInstaller.dll"/>
        </PayloadGroup>
      </Fragment>

      <Fragment>
        <PackageGroup Id="InstallerPackages">
          <RollbackBoundary Id="StartingPoint" Vital="yes" />
          <ExePackage Id="KambanFASSetup" Cache="no" Compressed="yes" Vital="yes" Permanent="no" Name="KambanCoreSetup"
                      SourceFile="..\..\Kamban.FAS.Setup_Source\$(var.Configuration)\KambanFASSetup.exe" >
            <CommandLine InstallArgument="[SqlInstance]" Condition="1" />
            <CommandLine InstallArgument="[DbName]" Condition="1"/>
            <CommandLine InstallArgument="[InstallPath]" Condition="1"/>
            <CommandLine InstallArgument="[Roles]" Condition="1"/>
            <CommandLine InstallArgument="[Modules]" Condition="1" />
            <CommandLine InstallArgument="[CustomInstall]" Condition="1"/>
          </ExePackage>

          <MsiPackage SourceFile="..\..\build_folder\$(var.Configuration)\Nestle.MES.CustomLayer\Nestle.MES.CustomLayerSetup.msi"
                      Id="NestleCustomLayerSetupPackage" Cache="yes" Visible="no" Compressed="yes" EnableFeatureSelection="yes" Vital="yes">
            <MsiProperty Name="INSTALLFOLDER" Value="[INSTALLFOLDER]"  />
            <MsiProperty Name="VERSION" Value="[VERSION]"/>
            <MsiProperty Name="ADDLOCAL" Value="[NestleFeatures]" />
          </MsiPackage>
        </PackageGroup>
      </Fragment>

      <Fragment>
        <util:RegistrySearch
          Id='SearchForKamban'
          Variable="KambanInstalled"
          Result="exists"
          Root="HKLM"
          Key="SOFTWARE\Wow6432Node\KambanFAS" />
        <bal:Condition Message="Product already Exists">
          KambanInstalled
        </bal:Condition>
      </Fragment>

在上面的代码中,您可以看到我的 Bundle 链中有一个 MsiPackage 和一个 ExePackage。 Id="KambanFASSetup" 的 ExePackage 也是一个托管引导程序应用程序,具有自己的自定义 UI。安装此父捆绑包 exe 后,我的程序和功能中有两个条目。我相信这是因为我有两个托管的引导程序 exe。所以现在在卸载 NestleMESSetup 时,只有我的 MsiPackage 正在卸载,而我的 ExePackage 没有。但我的要求如下

如果我卸载 Parent Exe,ExePackage 也应该被卸载。 子 ExePackage 的卸载必须静默进行。 IE 它的 UI 应该显示提示用户点击卸载 再次按钮。

如果需要更多信息,请告诉我。对此的任何帮助将不胜感激。

编辑1: 这是 %temp% 文件夹中的卸载日志

[2658:3330][2017-05-19T19:27:11]i001: Burn v3.10.2.2516, Windows v6.1 (Build 7601: Service Pack 1), path: C:\ProgramData\Package Cache\a21ebf3e-08b2-4b64-b5bf-38dccfea21a2\Nestle.MES.Setup.exe
[2658:3330][2017-05-19T19:27:11]i000: Initializing version variable 'KambanVersion' to value '1.0.647.0'
[2658:3330][2017-05-19T19:27:11]i009: Command Line: '/uninstall'
[2658:3330][2017-05-19T19:27:11]i000: Setting string variable 'WixBundleLog' to value 'C:\Users\RAJASA~1.000\AppData\Local\Temp\NestleMESSetup_20170519192711.log'
[2658:3330][2017-05-19T19:27:11]i000: Setting string variable 'WixBundleManufacturer' to value 'CT Infotech'
[2658:3330][2017-05-19T19:27:11]i000: Loading managed bootstrapper application.
[2658:3330][2017-05-19T19:27:11]i000: Creating BA thread to run asynchronously.
[2658:3330][2017-05-19T19:27:11]i100: Detect begin, 2 packages
[2658:3330][2017-05-19T19:27:11]i000: Setting numeric variable 'KambanInstalled' to value 1
[2658:3330][2017-05-19T19:27:11]i101: Detected package: KambanFASSetup, state: Absent, cached: None
[2658:3330][2017-05-19T19:27:11]i101: Detected package: NestleCustomLayerSetupPackage, state: Present, cached: Complete
[2658:3330][2017-05-19T19:27:11]i104: Detected package: NestleCustomLayerSetupPackage, feature: AppFeatures, state: Local
[2658:3330][2017-05-19T19:27:11]i104: Detected package: NestleCustomLayerSetupPackage, feature: WebFeatures, state: Local
[2658:3330][2017-05-19T19:27:11]i104: Detected package: NestleCustomLayerSetupPackage, feature: DbFeatures, state: Local

编辑2: 将检测条件添加到我的捆绑链 Exe 包中,我也无法卸载父 exe。 WiX日志如下

[1450:1BBC][2017-05-20T07:33:59]i371: Updating session, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\c8fb8ef8-905f-4bd9-8675-91f62d83e5c8, resume: Active, restart initiated: No, disable resume: No
[1644:0F04][2017-05-20T07:33:59]w341: Prompt for source of container: WixAttachedContainer, path: E:\TFS_Nestle\Nestle\build_folder\Debug\Nestle.MES.Setup\Nestle.MES.Setup.exe
[1644:0F04][2017-05-20T07:33:59]e054: Failed to resolve source for file: E:\TFS_Nestle\Nestle\build_folder\Debug\Nestle.MES.Setup\Nestle.MES.Setup.exe, error: 0x80070002.
[1644:0F04][2017-05-20T07:33:59]e000: Error 0x80070002: Failed while prompting for source (original path 'E:\TFS_Nestle\Nestle\build_folder\Debug\Nestle.MES.Setup\Nestle.MES.Setup.exe').    [1644:0F04][2017-05-20T07:33:59]e311: Failed to acquire container: WixAttachedContainer to working path: C:\Users\RAJASA~1.000\AppData\Local\Temp\B5BE6652-F453-40B5-A2BF-6313B191EA7F\9FD1B9E707102B3EB2E75EA87962C5C839E9588A, error: 0x80070002.
[1644:1B24][2017-05-20T07:33:59]e000: Error 0x80070002: Failed while caching, aborting execution.
[1450:1BBC][2017-05-20T07:33:59]i372: Session end, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\c8fb8ef8-905f-4bd9-8675-91f62d83e5c8, resume: ARP, restart: None, disable resume: No
[1450:1BBC][2017-05-20T07:33:59]i371: Updating session, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\c8fb8ef8-905f-4bd9-8675-91f62d83e5c8, resume: ARP, restart initiated: No, disable resume: No
[1644:1B24][2017-05-20T07:33:59]i399: Apply complete, result: 0x80070002, restart: None, ba requested restart:  No
[1644:1B24][2017-05-20T07:33:59]i500: Shutting down, exit code: 0x0

【问题讨论】:

您必须做的第一件事就是在详细登录的情况下运行卸载。我知道如何使用 MSI 安装程序来做到这一点,但我不知道如何使用引导安装程序来做到这一点。如果您搜索它,我确信该信息可在某处的内胎上找到。获取该日志并将 edit 放入您的问题中。 @Will 我检查了卸载日志,发现我的 ExePackage 没有被检测到。它的状态是缺席。在 Edit1 下附加了我的日志 @raja_89 因为你没有DetectCondition 【参考方案1】:

您的 ExePackage 缺少 UninstallCommand 属性,因此 burn 不知道如何正确卸载它。应该是这样的

UninstallCommand="/uninstall /quiet"

如果需要,可能会添加一些内容。

为了让burn能够检测到ExePackage,它应该定义属性DetectCondition。类似的东西

DetectCondition="KambanInstalled"

【讨论】:

感谢您提供的信息。现在我已经添加了一个检测条件,我的 Exe 包被检测到了。但是现在添加了检测条件,我也无法卸载父捆绑包。 WiX 日志附加在 Edit2

以上是关于无法从另一个托管引导程序应用程序卸载 WiX 托管引导程序应用程序的主要内容,如果未能解决你的问题,请参考以下文章

托管的 WiX 引导程序包

wix 托管引导程序:回滚失败

如何从Wix托管引导程序或自定义操作中读取某些注册表项?

如何强制卸载损坏的 Wix 捆绑包

Wix 托管引导程序应用程序:通过捆绑将变量传递给 msi

托管引导程序应用程序“无法解析文件源”