2014-10-16 160 views
0

我有两个Wix项目 - 一个创建MSI,另一个将其引导至exe文件。卸载Bundle会导致msi安装

使用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没有),但它仍然显示相同的行为。

<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

这里的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

EnableFeatureSelection \t YesNoType \t指定捆绑包是​​否允许单独控制msi包内的功能的安装状态。管理功能选择需要特别小心,以确保软件包的安装,修改,更新和卸载行为始终正确。默认值是“否”。 – Isaiah4110 2014-10-16 15:40:40

+0

为了测试,将属性“EnableFeatureSelection”更改为NO并查看它是否工作正常。 – Isaiah4110 2014-10-16 15:41:11

+0

更新了原始帖子以反映更改包。 – MrAppa 2014-10-16 15:53:14

回答

2

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

所以我不得不在此之前:

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

在卸载虽然,自定义操作将运行调整配置文件(这将失败becaue的文件不再exisited),这将导致应用程序回滚,这会导致安装程序再次运行。

更改安装顺序以下修复了这个问题:

<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再次显示出来,微星扔一个错误,你应该仔细检查逻辑。

0

添加到您的MsiPackage元素InstallCondition属性与NOT Installed。如果你想在升级时运行安装,那么ypu必须添加or UPGRADINGPRODUCTCODE

+0

试过这个,它没有工作。 – MrAppa 2014-10-17 14:30:13

2

这听起来像是MSI存在问题。由于您有DisplayInternalUI="yes",因此属于MSI的UI是您在添加或删除应用程序时看到的内容。我的猜测是,MSI安装对话框的显示顺序或显示对话框的条件存在一些问题。在没有看到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 ,不用发布任何MSI的UI对话框就直接跳到unistallation。这似乎是你想要做的,但是,如果你确实想在MSI中设置一系列对话框来指导用户完成卸载,你可以在这里添加这些对话框。

+0

使用msi的UI信息更新了问题。 – MrAppa 2014-10-20 11:57:59

+0

关闭WelcomeDlg行并未解决问题。然而,这似乎正在发生。当我卸载程序时,典型的卸载程序正在发生(这似乎是删除文件)。但是,文件被删除后,MSI的设置屏幕再次被调用。现在这些文件已经不存在了,所以它认为这是一个安装。 – MrAppa 2014-10-20 15:33:47