【问题标题】:Adding an external CAB to an MSI with an internal one将外部 CAB 添加到具有内部 CAB 的 MSI
【发布时间】:2018-02-01 17:48:49
【问题描述】:

我有一个安装应用程序的 Visual Studio 安装程序 (vs2015)。我希望它还安装一组配置文件,其内容因物理安装位置而异,将作为与 msi 相同目录中的 cab 文件提供。 cab 有一组已知文件,这些文件将分布在安装位置的 2 个文件夹中,并且由与安装程序不同的项目创建。如何让 msi 安装其内部内容和外部压缩包文件的内容?

【问题讨论】:

    标签: visual-studio windows-installer cab visual-studio-setup-proje


    【解决方案1】:

    智能包工作室

    实际上,我在当天使用 Wise Package Studio 成功地使用新文件更新了 MSI 文件。它向Cabs table 添加了一个 CAB 文件(我不知道这个表实际上是一个 Wise“视图”还是一个真正的 MSI 表 - 如果所有 CAB 都嵌入到 MSI 中,Orca 似乎缺少它)。 Media table 中有一个相应的条目,其中LastSequence 值(在媒体表中)描述了哪个 CAB 包含哪些文件。在文件表中,您将找到一个名为Sequence 的字段,它指定列出的文件的“顺序”。本质上,您的新文件将位于“订单”的末尾,因此位于新的 CAB 中。有点牵扯到整个事情。

    但是,我成功地让 Wise Package Studio 嵌入了新的 CAB 文件,并在安装过程中使用外部 CAB 文件安装新文件,但我没有记录该过程,也不记得所有脚步。此外我不推荐该程序 - 事实上我现在永远不会使用这种方法。它只是在我当时工作的地方使用。 在大多数情况下,我们使用转换将此内容添加到主包中,而不是破解 MSI 本身


    MSI SDK:在安装中包含一个 Cabinet 文件

    将 CAB 文件添加到 MSI 的过程记录在 MSI SDK 中:Including a Cabinet File in an Installation。相当参与 - 正如我所说,但绝对有可能。如您所见,Media 表中 CAB 名称开头缺少 # 标志表示外部 CAB 文件。

    所以我想,简而言之:

    1. 向文件表中添加一个新条目,将序列号从已经存在的最高序列文件条目设置为 +1。我也会在 Component table 中添加一个新的对应条目。
    2. Media table 中添加一个新行,在LastSequence 列中指定您为文件设置的编号。将您的压缩包文件的名称添加到Cabinet。确保不要在 CAB 名称前面加上 #
    3. Wise 还会在MsiFileHash table 中添加条目。不确定这是否需要。很确定这里不需要添加条目。
    4. 正如您将在链接的 MSI SDK 文章中看到的那样,您可以按照链接的 MSDN 内容中列出的最后几个步骤嵌入整个 cab。

    我希望我有时间测试所有这些,但我没有。这让我想到了下一点:


    默认/实例化您的设置?

    当我看到这样的问题时,我总是会问自己:这些文件中有什么?它们是“琐碎的设置”,实际上可以默认而不是硬编码在配置文件中吗?这为我节省了很多工作,很多次。

    MSI 和旧式安装程序的设置和数据文件的部署一直存在问题。我对此类文件的部署理念是将您安装的内容视为“只读”,然后将它们复制到每个用户的位置,或者在应用程序启动时将它们设置在 HKCU 中,使用一些获得适当值的理智过程(从编写的设置在安装过程中到 HKLM,从用户那里检索,从 Internet 检索,等等...)。请参阅有关该主题的更长答案:Create folder and file on Current user profile, from Admin Profile。在我看来,最好的方法是在启动时从在线数据库中检索设置(如果您阅读了该链接的内容,您会看到),但这涉及到。

    【讨论】:

      【解决方案2】:

      不清楚您的意思是什么,但您不能更改 MSI 以解压缩单独 CAB 中的所有文件,就好像它们与其他文件一样位于 MSI 中。 MSI 文件内部、文件表、组件表等文件内部数据过多。

      因此,如果 CAB 文件与 MSI 文件位于同一位置,那么您可以创建自定义操作将其复制到目标系统,并根据需要解压缩。副本可以通过使用 [SourceDir] 属性或 [OriginalDatabase] 属性OriginalDatabase property 来告知 MSI 位置在哪里

      您将解析该位置以获取路径,然后将其复制到 TARGETDIR 位置。

      【讨论】:

        猜你喜欢
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-28
        • 2010-12-28
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多