简短回答:您的 setup.exe 可以由另一个 setup.exe 安装,只要它不会同时安装多个 MSI 文件,并且其他setup.exe 也按顺序运行,而不会一次产生多个 MSI 安装。技术说明如下。
基本上,您可以以setup.exe、MSI 或a merge module 或以上所有方式提供您的设置。
更新:我想看看你是否熟悉 WiX 包含文件?
InstallExecuteSequence Mutex:由于非常基本的技术原因,两个 MSI 文件无法同时运行它们的实际安装操作(实际更改系统的操作)(@987654321当InstallExecuteSequence 在InstallInitialize 和InstallFinalize 之间运行时设置@。
多个 MSI GUI:我已经多次写过这个问题,但我认为最直接的解释是 this one from serverfault。本质上,系统被锁定以确保在安装过程中发生错误时可以回滚所有更改。应该注意的是,您可以一次启动多个 MSI 文件并进入它们的 GUI 序列(换句话说,显示为实际安装做准备的设置对话框),但在进行实际系统更改时,您一次只能启动一个 - 在技术上表示运行 InstallExecuteSequence 的术语。
序列化的 MSI 文件:MSI 文件可以“一个接一个地”运行而不会出现问题,只要它们都经过精心设计。 WiX 引导程序 Burn 是专门为此目的而制作的(以及其他一些免费用途:下载器、引导程序、排序器、允许外部、自定义设置 GUI 等...)。
可能的方法:您的设置似乎将包含在其他软件套件的安装中?这里有几个选项。
按顺序运行:如果其他软件供应商对此表示同意,他们可以将您的setup.exe 包含在他们的中,然后让它运行完成继续他们自己的设置。这意味着他们使用 WiX (Burn) 创建的 setup.exe 或使用 Advanced Installer、Installshield 或其他商业工具(甚至只是 dotnetInstaller - 这是一个免费的引导程序)生成的等效 setup.exe 来执行此操作。
-
Merge Module (a Symantec article):或者,您可以从自己的设置中创建一个“合并模块” - 这是一个消耗性的二进制“捆绑包”可以在编译/构建时合并到任何 MSI 设置中。它是一个小数据库片段,如果您愿意,也可以是部分数据库。它将包含您设置为以适当方式安装的所有组件。本质上,合并模块是将您的设置作为可消耗的整个组件交付,它成为其他设置的实际部分 - 无需作为单独的先决条件设置进行安装。换句话说,它是交付运行时的另一种方式,无需交付单独的设置。这是 MSI 最初打算如何部署先决条件的方式,现在基本上仍然是 - 尽管现在存在诸如 Burn 之类的替代方案。
-
MSI 文件:坦率地说,我最喜欢的方法是不用担心 setup.exe 启动器会执行大量先决条件安装,而是提供符合标准的 MSI 文件,您的客户可以在自己安装之前按顺序运行。如果未安装适当的运行时,您的 MSI 可以设置启动条件以拒绝安装。这样,如果发现错误,您的 MSI 可以“自我更新”,理论上它可以单独分发 - 无需重新编译捆绑合并模块的所有设置 - 到安装了您的软件的第一个版本的任何计算机。我喜欢这种解耦。
真实故事:很多人喜欢合并模块。我不得不承认我不是一个超级粉丝,但如果做得好,它们会很好地工作。有时,我不得不处理合并模块,这些模块破坏了完美的设置,它们令人难以置信的内置设计缺陷(我想到了过去的 SOAP 合并模块 - 它彻底 - 并且单枪匹马 - 引发了我的设置错误率,必须删除)。不是合并模块本身作为一种技术的问题,而是不止一次引起问题的实际问题。
故事的寓意:不要提供一个糟糕的合并模块,其中包含许多失败的自定义操作和奇怪的要求,这些要求会使“父设置”变得臃肿,并带有不必要的脆弱性和内容。如果您提供了一个符合标准的合并模块,它“最小化”地完成其任务 - 那么这是部署您的运行时的好方法,甚至是一些供应商的首选。
Core OS Runtimes:我建议不要将 .NET 框架与您的设置捆绑在一起 - 特别是如果它用于企业用途。 Dot NET 现在几乎可以通过操作系统本身随时使用,并且设置中包含的运行时很快就会变得过时膨胀和“胖”,企业应用程序打包者将花费大量时间从您的包中摆脱出来。 Dot NET 更新最好通过 Windows Update(或等效的公司部署机制)分发。
相反,拥有one-page (PDF) document explaining (see a bit down the page) 似乎是一种正常的方法,您的应用程序需要哪些先决条件才能正常运行。当然,对于合并模块组件,您会记录这一点,因为您不能将核心运行时包含在您自己的合并模块中 - 通常您只能安装自己的文件。
一些链接(仅供参考):