我正在安装一个大型应用程序,其中一部分是名为“DbUpdateManager”的自定义编写工具,用于针对目标数据库大规模执行SQL脚本。

现在,WiX 2.x安装可以正常工作-但它有一个缺陷:在安装过程中,我还安装了几个Windows服务,可以选择立即启动这些服务。但是,如果尚未运行DbUpdateManager,则这些操作将失败。

所以我要完成的是:

  • 从我的MSI
  • 安装DbUpdateManager和我的服务
  • 在任何服务启动之前运行DbUpdateManager

    我当前的WiX源看起来像这样:
    <Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' >
      <!-- DbUpdateManager component with the necessary files -->
      <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'>
         <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe'
               Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe'  KeyPath='no' />
      </Component>
    
      <!-- Component to install one of my Windows services -->
      <Component Id='InstallServiceComponent' Guid='...' DiskId='1'>
         <File Id='InstallServiceFile' LongName='MyService.exe'
               Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/>
         <ServiceInstall Id='InstallMyService' Name='MyService'
                         Description='My Service' ErrorControl='normal'
                         Start='auto' Type='ownProcess' Vital='yes' />
         <ServiceControl Id='UninstallMyService' Name='MyService'
                         Remove='uninstall' Wait='yes' />
      </Component>
    
      <!-- Feature for the DbUpdateManager referencing the above component -->
      <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR'
               AllowAdvertise='no' Description='DbUpdateManager' Level='1'
               Title='Database Update Manager'>
         <ComponentRef Id='DbUpdateManagerComponent'/>
      </Feature>
    
      <!-- Custom action for running DbUpdateManager -->
      <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile'
                    ExeCommand='' Return='asyncWait' />
    
      <!-- Calling the custom action in the install sequence -->
      <InstallExecuteSequence>
          <RemoveExistingProducts After='InstallInitialize' />
          <Custom Action='RunDbUpdateManagerAction'
                  After='InstallFinalize'>&amp;DbUpdateManager=3</Custom>
    

    我继承了此WIX,并且可以正常工作-但正如我所说-DbUpdateManager在该过程中被调用为时太晚(仅“After = InstallFinalize”),因此服务一开始将无法正确启动(第二次运行正常)在您运行DbUpdateManager后手动重新启动它们时)。

    我仔细查看了MSI文档,发现了一个很好的步骤,称为“StartServices”,所以我的直觉是将调用自定义操作更改为:
       <InstallExecuteSequence>
              <Custom Action='RunDbUpdateManagerAction'
                      Before='StartServices'>&amp;DbUpdateManager=3</Custom>
    

    不幸的是,在这种情况下,什么也没有发生-DbUpdateManager永远不会被调用...。

    有什么想法吗?调试MSI/WiX的东西确实非常棘手,而且我似乎再也看不到树林中的树木了。

    谢谢!
    马克

    编辑:“RunDbUpdateManagerAction”在我的MSI中的InstallExecuteSequence表中的正确位置-在InstallServices之后才正确,而在StartServices之前-却不起作用...。DbUpdateManager(Winforms实用程序)在此期间不显示安装 :-(

    编辑2:现在,我的操作似乎已在正确的时间执行-不幸的是,我只是没有看到向导:-(我看到的是错误代码“返回值1631”,其含义类似于“MSI Service”无法启动”-wtf ???

    MSI(s)(2C:D8)[20:53:36:383]:执行操作:RunDbUpdateManagerAction
    行动20:53:36:RunDbUpdateManagerAction。
    操作从20:53:36开始:RunDbUpdateManagerAction。
    MSI(s)(2C:D8)[20:53:36:383]:执行操作:StartServices
    行动20:53:36:StartServices。服务正在启动
    操作从20:53:36开始:StartServices。
    操作在20:53:36完成:RunDbUpdateManagerAction。返回值1631。

    最佳答案

    尝试获取安装的日志文件,并在其中查找序列顺序以及执行“定制操作”的条件值

    在命令行中使用此命令:
    msiexec/i [msiname]/l * v [文件名]

    编辑:阅读您的评论后,看看此页面here您可以尝试在条件中添加NOT INSTALLED

    EDIT2:我找到此page搜索您的错误编号1631

  • 10-06 13:41