WiX - 试图找出安装顺序

2024-01-01

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

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

所以我想要完成的是:

  1. 从我的 MSI 安装 DbUpdateManager 和我的服务
  2. 运行 DbUpdateManagerBEFORE任何服务启动

我当前的 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实用程序)确实not安装过程中出现:-(

编辑 2:现在我的操作似乎已在正确的时间执行 - 不幸的是,我只是没有看到我的向导:-( 我看到的是错误代码“返回值 1631”,这意味着类似“MSI 服务”无法启动”-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:启动服务。服务正在启动中 操作于 20:53:36 开始:StartServices。 操作于 20:53:36 完成:RunDbUpdateManagerAction。返回值1631。


好吧,在每个回复者的帮助下,并通过查阅网络上的一些 WiX 教程和帮助页面,我终于让它发挥作用了。 MSI 安装程序的东西不容易弄清楚和学习......

基本上,我将自定义操作的执行更改为“延迟”(按照 Rob 的建议),并将执行顺序中的点移至“After=InstallFiles”。我还将 标记中的条件更改为“未安装”,这在我的场景中似乎工作得很好。

与 Rob 担心的相反,数据库更新管理器及其 UI 通过这种方式表现得非常好,并且更新数据库的过程现在在我们的任何服务(依赖于数据库)启动之前完成。

期待 WiX 3.0(及其未来)的完整 RTM 版本!

感谢大家 - 不幸的是,我只能接受一个答案 - 所有人都应得的。

Marc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WiX - 试图找出安装顺序 的相关文章

  • 如何使用自定义操作在 WiX 中运行脚本 - 最简单的示例?

    WiX新手问题 我该怎么办1 将一次性 shell 脚本与安装程序一起复制到 temp e g
  • Windows 安装程序和安装应用程序合并到一个文件中?

    我使用 Visual Studio 在 C 中编写了一个应用程序 我创建了一个项目设置文件 该文件在我的调试中为我创建了文件 Windows Installer 和安装应用程序都是必需的 但我想将它们合并为一个 就像当您下载应用程序时 安装
  • 与 WiX 3.0 一起安装 WiX 3.5

    是否可以同时安装 WiX 3 0 和 3 5 如果我在安装 3 0 后安装 3 5 它会删除 3 0 文件 如果我尝试在 3 5 之后安装 3 0 它会告诉我已经安装了较新的版本 我正在从 VS 2008 迁移到 VS 2010 因此我的应
  • 根据 VS 活动配置定义 Wix 属性和值

    如何定义根据激活的 Visual Studio 配置而变化的 Wix 属性和值 例如对于我们的发布版本 var x 1 对于导出版本 var x 2 我们使用 wixproj 文件将属性传递到 WiX
  • 使用 元素通过 Wix 运行 SQL 脚本文件

    我是 Wix 安装程序的新手 我有一个要求 必须提供 SQL Server 登录凭据并从特定路径运行脚本 我不明白出了什么问题 项目已成功构建并创建了 msi 运行后我收到以下错误 错误26204 错误 2147217900 无法执行SQL
  • WiX - 通过检查修订来防止降级

    我正在寻找一种方法来防止我的应用程序降级 但 问题 是 我必须检查修订号 例如 安装 1 0 0 1 时应该可以安装 1 0 0 2 但安装 1 0 0 2 时不应该安装 1 0 0 1 我知道 Element MajorUpgrade 仅
  • Google Cloud SDK 安装失败 UnicodeDecodeError:“ascii”编解码器

    我在安装时遇到以下错误谷歌云SDK https cloud google com sdk docs 在我的 Windows 10 计算机上 ERROR gcloud failed to load ascii codec can t deco
  • WIX 自动生成 GUID *?

    假设我生成产品 ID 为 的 WIX XML 文件 另外 对于每个组件 GUID 我都使用
  • 让 WIX 在项目中包含引用

    我对 WiX 和设置自定义安装程序完全陌生 所以我对问题的主题表示歉意 我有一个内部业务应用程序 日记 它构建并运行良好 因此我按照教程 官方文档添加 WiX 项目并引用日记的 csproj 然后构建并运行这个最基本版本的 WiX 安装程序
  • Burn in WiX 3.6 如何将 MSI 文件捆绑到 .exe 中?

    我有兴趣了解 WiX 如何捆绑使用 Burn 创建的 EXE 文件 我知道创建一个自解压 EXE 文件非常简单 我已经完成了一百万次了WinRAR http en wikipedia org wiki WinRAR EXE 文件解压到哪个目
  • Wix - 自定义安装目录

    我使用的是 Wix 3 x 用户应该能够选择目标目录 我的Setup wxs目前是这样的 http pastebin com uH1EjbDQ http pastebin com uH1EjbDQ 询问用户自定义目标目录的最简单方法是什么
  • 如何使用 Wix 运行 sql 脚本创建数据库

    我在使用 Wix 创建数据库时遇到问题 我能找到的示例 参见下面的链接 都是首先使用 wix 创建数据库并运行创建表 sql 脚本 问题是我需要将 wix 设置为使用 CREATE DATABASE 运行 sql 脚本来创建数据库和表 而不
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • 在 WiX 文件中,Name="SourceDir" 指的是什么?

    WiX 文件似乎总是包含这一行
  • 为什么最新的 Python 3.8.x 版本不提供 Windows 安装程序?

    我需要在Windows计算机上安装Python 3 8并希望使用最新的小版本3 8 12 https www python org downloads release python 3812 官方发布网页提供了源代码的 tarball 文件
  • 创建新用户并将其添加到管理员时出现权限错误

    我用 WiX 3 8 创建了一个设置项目 我想在其中创建一个新用户并将其添加到管理员组 但每次我的设置达到这一点时 我都会因为权限不足而收到错误 这有点奇怪 因为我的用户是虚拟机的管理员 我在虚拟机上测试设置 我能做些什么 这是 WXS 文
  • 如何禁用恢复 Visual Studio 安装程序项目丢失的文件?

    我创建了一个使用来自暴雪 API 服务的图像的程序 我为该程序创建了一个安装程序 并将图像放置在 用户的应用程序数据文件夹 中 安装非常好 图像被解压到文件夹 AppData Roaming MyApp 中 如果需要删除图像 程序将从暴雪服
  • CAQuietExec 命令字符串必须以带引号的应用程序名称开头

    好吧 我相信我正在按照 Wix3 5 中的在线示例执行安静命令 但我似乎无法让我的命令被引用
  • 如何使用 SCCM 服务器推送带参数的 MSI

    我想使用 SCCM 服务器推送带有参数的 MSI 安装程序 IE msiexec exe i setup msi INSTALLFOLDER SpecifiedInstallationLocation CONFIGFILE FileName
  • 在 WiX 中轻量运行时,DefaultDir 无效

    我只是想做一个安装程序 将一些文件移动到程序文件中 设置开始菜单链接 并出现在要卸载的添加 删除程序中 目前我很乐意点击开始菜单链接 因为这看起来相对简单 需要注意的是 我特别希望可以通过脚本构建它without任何类型的全局安装 这意味着

随机推荐