我有两个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>
答案 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
。