0

我有两个 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>
4

3 回答 3

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>

这将使用引导程序欢迎屏幕来确定用户是否要卸载,并且由于没有Installed发布 的​​条件VerifyReadyDlg,因此直接跳到卸载而不发布任何 MSI 的 UI 对话框。这似乎是您想要做的,但是,如果您确实想在 MSI 中设置一系列对话框来指导用户完成卸载,您可以在此处添加这些对话框。

于 2014-10-17T17:56:55.323 回答
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 抛出错误,您应该仔细检查该逻辑。

于 2014-10-22T18:47:14.560 回答
0

使用 .添加到您的MsiPackage元素InstallCondition属性NOT Installed。如果要在升级时运行安装,则 ypu 必须添加or UPGRADINGPRODUCTCODE.

于 2014-10-17T08:48:03.703 回答