将外部CAB添加到具有内部CIB的MSI

时间:2018-02-01 17:48:50

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

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

2 个答案:

答案 0 :(得分:0)

目前还不清楚你的意思,但是你无法改变MSI来解压缩你单独的CAB中的所有文件,就像它们在MSI中一样,就像其他文件一样。 MSI文件内的文件,文件表,组件表等中的内部数据太多。

因此,如果CAB文件与MSI文件位于同一位置,则可以创建自定义操作以将其复制到目标系统,并在需要时解压缩。可以使用[SourceDir]属性或[OriginalDatabase]属性OriginalDatabase property

告知副本MSI位置的位置

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

答案 1 :(得分:0)

Wise Package Studio

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

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

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

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

所以我想,简而言之:

  1. 在文件表中添加一个新条目,将序列号从已存在的最高序列文件条目设置为+1。我还会在Component table中添加一个新的相应条目。
  2. Media table添加新行,在LastSequence列中指定您为该文件设置的数字。将cabinet文件的名称添加到Cabinet。请确保不要在CAB名称前加上#
  3. Wise还会在MsiFileHash table中添加条目。不确定是否需要这样做。很确定这里不需要添加条目。
  4. 正如您将在链接的MSI SDK文章中看到的那样,您可以按照链接的MSDN内容中列出的最后几个步骤嵌入整个cab。
  5. 我希望我有时间测试这一切,但我没有。这让我想到了下一点:

    默认/实例化您的设置?

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

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