c# - WiX - 如何使用配置文件来决定运行哪个 MSI?

标签 c# wix windows-installer custom-action bootstrapper

我想创建一个安装程序套件,以链式方式运行多个安装程序。主套件应使用配置文件,以便安装程序根据此配置 XML 决定运行哪个版本的 MSI。目标是避免在新版本软件发布时必须更新任何 WiX 或 Bootstrapper 项目。相反,只需更新配置 XML 即可更改将安装在链中的内容。

例如,只需更新 XML 中特定 MSI 的源路径,以便主安装程序读取此新路径并运行新 MSI 而不是旧 MSI。

据我了解,Bootstrapper 项目中的问题是所有包都是硬编码的,因此它没有为包的源路径提供灵 active 。

我还尝试在各个 MSI 中使用自定义操作。在读取 XML 后,我可以使用 C# 获取和设置 MSI 的属性,这看起来很有希望,但是这些属性不能用作源路径的变量。

我还尝试在第一个 MSI 中使用自定义操作运行第二个 MSI。遗憾的是,这没有成功。

如果有任何建议,我将不胜感激!

tldr,我想运行最初未包含在构建中的安装程序。类似于“DownloadUrl”,但来自本地网络。可以使用属性更改其值,因此无需在每次路径更改时都重新构建项目。

最佳答案

我认为使用单个 XML 文件来控制安装哪些包会很困难。在刻录脚本中,设置变量的选项仅限于:

  • <FileSearch>
  • <RegistrySearch>
  • <DirectorySearch>
  • <ComponentSearch>
  • <ProductSearch>

只有这些 <FileSearch><DirectorySearch>可以探测源位置。

您可以使用文件的存在/不存在来控制 MSI 包的安装,从而使它起作用。在您的刻录项目中使用 util:FileSearch从源路径查找文件的元素:

<util:FileSearch Id="InstallMSI01"
      Variable="InstallMSI01"
      Result="exists"
      Path="[SourceDir]InstallMSI01.txt" />

这应根据源路径中是否存在文件 InstallMSI01.txt 将变量 InstallMSI01 设置为“true”或“false”。然后,您可以在 MSIPackage 的安装条件中使用该变量:

<MsiPackage
    Id="MSI01"
    SourceFile="-- Your Source Path--"
    InstallCondition="InstallMSI01 = &quot;true&quot;">
</MsiPackage>

关于c# - WiX - 如何使用配置文件来决定运行哪个 MSI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30662390/

相关文章:

c# - 为什么我的 SqlCommand 返回一个字符串,而它应该是一个 int?

javascript - 在 C# 中解析 JSON 文件 (Unity)

c# - 在 word 中的现有选项卡中自定义新菜单

wix - 验证用户必须至少安装一个子功能

c# - 如何在隐藏时调用对象方法

windows - 我想检测是否已使用 WIX 在用户系统上安装了特定的 Microsoft 修补程序。实现这一目标的最简单方法是什么?

wix - 有条件地将单个 WiX 属性设置为不同的值

wix - 安装 MSI 之前删除文件和目录

windows-installer - 安装程序不会覆盖为客户端分支的旧 DLL

wix - 从安装程序将安装位置写入注册表