卸载Bundle会导致msi安装

时间:2014-10-16 14:33:23

标签: wix bootstrapper wix3.8

我有两个Wix项目 - 一个用于创建MSI,另一个用于将其引导到exe中。

使用exe,我可以毫无问题地安装应用程序,但是当我尝试卸载应用程序时,我再次获得安装程序的设置菜单,并尝试重新安装。

如果我取消重新安装,并再次尝试卸载,则按预期工作。

如果我使用msi执行相同的工作流程,它将按预期工作。

这是我的引导程序的样子:

<Bundle Name="name" Version="2.0.0.0" Manufacturer="company" UpgradeCode="guid" IconSourceFile="icon.ico" DisableModify="yes">

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
        <bal:WixStandardBootstrapperApplication LicenseFile="license.rtf" SuppressOptionsUI="yes" SuppressRepair="yes" />
    </BootstrapperApplicationRef>

<Chain>
  <MsiPackage SourceFile="application.msi" DisplayInternalUI="yes" EnableFeatureSelection="yes"/>
</Chain>
</Bundle>

有什么想法吗?

更新

根据建议,我已将我的包修改为以下内容(将EnableFeatureSelection设置为no),但它仍然显示相同的行为。

<Bundle Name="name" Version="2.0.0.0" Manufacturer="company" UpgradeCode="guid" IconSourceFile="icon.ico" DisableModify="yes">

    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
        <bal:WixStandardBootstrapperApplication LicenseFile="license.rtf" SuppressOptionsUI="yes" SuppressRepair="yes" />
    </BootstrapperApplicationRef>

<Chain>
  <MsiPackage SourceFile="application.msi" DisplayInternalUI="yes" EnableFeatureSelection="no"/>
</Chain>
</Bundle>

更新#2

我注意到,当我第一次卸载并启动安装设置时,如果我取消安装,它会失败,但它已经删除了所有文件和注册表项。第二次运行卸载会从“添加/删除程序”中删除该条目(成功)。

更新#3

这里是msi的UI序列

<UI>
  <DialogRef Id="WelcomeDlg"/>
  <DialogRef Id="LicenseAgreementDlg"/>
  <DialogRef Id="VerifyReadyDlg"/>
  <DialogRef Id="ErrorDlg" />
  <DialogRef Id="FatalError" />
  <DialogRef Id="FilesInUse" />
  <DialogRef Id="UserExit" />
  <DialogRef Id="SelectDbDlg" />

  <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg"></Publish>
  <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">NOT Installed</Publish>
  <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="SelectDbDlg">NOT Installed</Publish>
  <Publish Dialog="SelectDbDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
  <Publish Dialog="SelectDbDlg" Control="Next" Event="NewDialog" Value="DbCreateCredDlg">NOT Installed</Publish>
  <Publish Dialog="DbCreateCredDlg" Control="Back" Event="NewDialog" Value="SelectDbDlg">NOT Installed</Publish>
  <Publish Dialog="DbCreateCredDlg" Control="Next" Event="NewDialog" Value="SetupTypeDlg">NOT Installed</Publish>

  <Publish Dialog="SetupTypeDlg" Control="Back" Event="NewDialog" Value="DbCreateCredDlg">NOT Installed</Publish>
  <Publish Dialog="SetupTypeDlg" Control="Next" Event="NewDialog" Value="FeaturesDlg">NOT Installed</Publish>
  <Publish Dialog="SetupTypeDlg" Control="CustomButton" Event="NewDialog" Value="FeaturesDlg">NOT Installed</Publish>
  <Publish Dialog="SetupTypeDlg" Control="TypicalButton" Event="NewDialog" Value="VerifyReadyDlg">NOT Installed</Publish>
  <Publish Dialog="SetupTypeDlg" Control="CompleteButton" Event="NewDialog" Value="VerifyReadyDlg">NOT Installed</Publish>

  <Publish Dialog="FeaturesDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg">NOT Installed</Publish>

  <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="SetupTypeDlg">NOT Installed</Publish>
  <Publish Dialog="ExitDialog" Control="Back" Event="EndDialog" Value="VerifyReadyDlg">1</Publish>
  <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
</UI>

3 个答案:

答案 0 :(得分:2)

这听起来像MSI有问题。由于您有DisplayInternalUI="yes",因此属于MSI的UI就是您在添加或删除应用程序时看到的内容。我的猜测是,显示MSI安装对话框的顺序或显示MaintenanceTypeDlg对话框的条件存在一些问题。如果没有看到在MSI上设置的选项,或UI对话框的发布顺序以及显示它们的条件,很难说明问题出在哪里。用于MSI的UI片段的示例将有助于进一步诊断这是否是问题。

---- ----编辑

正如我所料,您的UI遵循的唯一路径是安装路径,WelcomeDlg元素上的条件强制它沿着该路径行进。要解决此问题,请删除当前WelcomeDlg并替换为以下两行:

<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed AND NOT PATCH</Publish>
<Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>

这将使用bootstrapers欢迎屏幕来确定用户是否想要卸载,并且由于没有Installed条件来发布VerifyReadyDlg,所以跳过右侧的unistallation而不发布任何MSI& #39; UI对话框。这似乎是您要做的事情,但是,如果您确实想在MSI中设置一系列对话框以指导用户完成卸载,您可以在此处添加这些对话框。

答案 1 :(得分:2)

经过几天的讨论,我发现了问题,这是由于MSI在卸载时抛出错误(默默地)。我定义了一些自定义操作,但我没有将它们设置为仅在安装时运行。

所以我之前有这个:

<InstallExecuteSequence>
  <Custom Action="ServerName.Set" Before="AdjustConfigurationFile"/>
  <Custom Action="AdjustConfigurationFile" Before="InstallFinalize"/>
  <Custom Action="CreateDatabase" After="InstallFinalize"/>
</InstallExecuteSequence>

卸载后,自定义操作将运行以调整配置文件(由于文件不再存在而失败),这将导致应用程序回滚,这将导致安装程序再次运行。

将安装顺序更改为以下内容可解决此问题:

<InstallExecuteSequence>
  <Custom Action="ServerName.Set" Before="AdjustConfigurationFile">NOT Installed</Custom>
  <Custom Action="AdjustConfigurationFile" Before="InstallFinalize">NOT Installed</Custom>
  <Custom Action="CreateDatabase" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>

这里要说的是,如果您要卸载引导程序并且安装程序UI再次出现,那么MSI会发生错误,您应该仔细检查该逻辑。

答案 2 :(得分:0)

使用InstallCondition添加到 MsiPackage 元素NOT Installed属性。如果你想在升级时运行install,那么ypu必须添加or UPGRADINGPRODUCTCODE