检测到FilesInUse时,为什么Bootstrapper会挂起?

时间:2015-07-21 14:56:12

标签: wix wix3 wix3.10

我正在使用WiX Toolset v3.10.0.1726

我有一个捆绑在引导程序中的.msi文件。

MSI Defintion:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*"
           Name="$(var.ProductName)"
           Language="!(loc.ProductLanguage)"
           Version="!(bind.fileVersion.FILE)"
           Manufacturer="$(var.Manufacturer)"
           UpgradeCode="$(var.UpgradeCode)">
    <Package InstallerVersion="200"
             Compressed="yes"
             InstallScope="perMachine"
             Platform="x86"
             InstallPrivileges="elevated"
             ReadOnly="yes" />
    <MediaTemplate EmbedCab="yes" />

    <?include Feature.wxi?>

    <MajorUpgrade AllowDowngrades="no"
                  AllowSameVersionUpgrades="yes"
                  DowngradeErrorMessage="!(loc.DowngradeErrorMessage)" />

    <UI Id="UserInterface">
      <Property Id="WIXUI_INSTALLDIR"
                Value="TARGETDIR" />
      <Property Id="WixUI_Mode"
                Value="Custom" />

      <TextStyle Id="WixUI_Font_Normal"
                 FaceName="Tahoma"
                 Size="8" />
      <TextStyle Id="WixUI_Font_Bigger"
                 FaceName="Tahoma"
                 Size="9"
                 Bold="yes" />
      <TextStyle Id="WixUI_Font_Title"
                 FaceName="Tahoma"
                 Size="9"
                 Bold="yes" />

      <Property Id="DefaultUIFont"
                Value="WixUI_Font_Normal" />

      <DialogRef Id="ProgressDlg" />
      <DialogRef Id="ErrorDlg" />
      <DialogRef Id="FilesInUse" />
      <DialogRef Id="FatalError" />
      <DialogRef Id="UserExit" />

      <Publish Dialog="ProgressDlg"
               Control="Next"
               Event="EndDialog"
               Value="Return"
               Order="2" />
    </UI>
  </Product>
</Wix>

如果直接执行.msi文件,则在应用程序运行时,FilesInUse对话框会正确显示。一切都很好。

现在我已将.msi文件集成到引导程序中:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
  <Bundle Name="!(bind.packageName.Setup)"
          Version="!(bind.packageVersion.Setup)"
          Manufacturer="!(bind.packageManufacturer.Setup)"
          UpgradeCode="$(var.UpgradeCode)"
          DisableModify="yes">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
      <bal:WixStandardBootstrapperApplication LicenseUrl=""
                                              SuppressOptionsUI="no"
                                              ShowVersion="yes"
                                              SuppressRepair="yes"
                                              LogoFile="Resources/dpd.png" />
    </BootstrapperApplicationRef>
    <Chain DisableSystemRestore="yes">
      <MsiPackage Id="Setup"
                  Compressed="yes"
                  Name="$(var.ProductName)"
                  SourceFile="setup.msi"
                  DisplayInternalUI="yes"
                  Vital="yes" />
    </Chain>
  </Bundle>
</Wix>

我需要DisplayInternalUI因为我在.msi文件中有一些额外的对话框,这些对话框是设置所必需的。

如果应用程序未在升级方案中运行,则一切正常,而升级时正在运行的应用程序会使引导程序和.msi文件进入无响应状态。

日志的输出:

  

[2A34:28F0] [2015-07-21T16:38:40] i001:Burn v3.10.0.1726,Windows v6.1   (Build 7601:Service Pack 1),路径:W:\ work \ SETUP.exe
...
  [2A34:28F0] [2015-07-21T16:38:40] i009:命​​令行:' - burn.unelevated   BurnPipe {571E9E94-4908-45EE-A6AC-05F923FAFDCF}   {F7B2FBA0-BAEB-42C7-B1D5-B8704F153049} 10904 / log log.txt'
  ... [2A34:28F0] [2015-07-21T16:38:41] i300:申请开始
  ... [2A98:054C] [2015-07-21T16:38:42] i301:应用执行   包:安装程序,操作:安装,路径:C:\ ProgramData \ Package   缓存{99D06386-9447-4D7B-8307-E53C12BB09B5} v2.0.19.28124 \ FOOAPPLICATION,   参数:'ARPSYSTEMCOMPONENT =“1”MSIFASTINSTALL =“7”   INSTALLFOLDER =“C:\ FOOFOLDER”TRANSFORMS =“:1031”'

msi-log的输出(至少是最后的相关行):

  

...
  MSI(s)(24:D4)[16:38:42:826]:采取行动:InstallValidate
  MSI(s)(24:D4)[16:38:42:827]:财产变更:删除   MsiRestartManagerSessionKey属性。它的当前价值是   '053651647df31e46971d3237c9eb6a06'。
MSI(s)(24:D4)   [16:38:42:827]:转换表格对话。
... ...
MSI(s)   (24:D4)[16:38:42:828]:注意:1:2205 2:3:BindImage
MSI(s)   (24:D4)[16:38:42:828]:注意:1:2205 2:3:ProgId
MSI(s)   (24:D4)[16:38:42:828]:注意:1:2205 2:3:PublishComponent
  MSI(s)(24:D4)[16:38:42:828]:注意:1:2205 2:3:SelfReg
MSI   (s)(24:D4)[16:38:42:828]:注意:1:2205 2:3:分机
MSI   (s)(24:D4)[16:38:42:828]:注意:1:2205 2:3:字体
MSI(s)   (24:D4)[16:38:42:828]:注:1:2205 2:3:班级MSI(s)   (24:D4)[16:38:42:828]:注意:1:2205 2:3:TypeLib
MSI(s)   (24:D4)[16:38:42:829]:注意:1:2205 2:3:_RemoveFilePath
MSI   (s)(24:D4)[16:38:42:993]:注意:1:1402 2:HKEY_CLASSES_ROOT.NET 3:   2
MSI(24:D4)[16:38:43:127]:注:1:1402 2:   HKEY_CLASSES_ROOT.NET 3:2
MSI(24:D4)[16:38:43:221]:   PROPERTY CHANGE:修改CostingComplete属性。它的当前价值   是'0'。其新值:'1'。
MSI(s)(24:D4)[16:38:43:222]:   注意:1:2205 2:3:BindImage
MSI(s)(24:D4)[16:38:43:222]:   注意:1:2205 2:3:ProgId
MSI(24:D4)[16:38:43:222]:   注意:1:2205 2:3:PublishComponent
MSI(24:D4)   [16:38:43:222]:注:1:2205 2:3:SelfReg
MSI(24)(D4)   [16:38:43:222]:注:1:2205 2:3:延期
MSI(24:D4)   [16:38:43:222]:注意:1:2205 2:3:字体
MSI(s)(24:D4)   [16:38:43:222]:注:1:2205 2:3:班级以MSI(24:D4)   [16:38:43:222]:注意:1:2205 2:3:TypeLib
MSI(s)(24:D4)   [16:38:43:222]:注:1:2727 2:
MSI(24:D4)[16:38:43:314]:   转换表错误。

MSI(s)(24:D4)[16:38:43:314]:   转换表错误。

转换MSI(c)(98:4C)[16:38:43:326]:   RESTART MANAGER:会话已打开。

那么,为什么引导程序中的msi会挂起(并导致引导程序挂起),我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

由于您的链上的DisableSystemRestore值,您跳过了系统还原点的创建,但是您没有在msi中执行类似的操作。您可以通过设置MSIFASTINSTALL属性跳过在msi中创建还原点。适用于MSI 5.0,如下所述:http://msdn.microsoft.com/en-us/library/dd408005(VS.85).aspx

<!-- Add me to your MSI definition -->
<Property Id="MSIFASTINSTALL" Value="1" />