我有一个安装应用程序的visual studio安装程序(vs2015)。我希望它还安装一组配置文件,其内容因物理安装位置而异,将作为cab文件提供在与msi相同的目录中。 cab有一组已知的文件,这些文件将分布在安装位置的2个文件夹中,并由与安装程序不同的项目创建。如何让msi安装其内部内容和外部cabinet文件的内容?
答案 0 :(得分:0)
目前还不清楚你的意思,但是你无法改变MSI来解压缩你单独的CAB中的所有文件,就像它们在MSI中一样,就像其他文件一样。 MSI文件内的文件,文件表,组件表等中的内部数据太多。
因此,如果CAB文件与MSI文件位于同一位置,则可以创建自定义操作以将其复制到目标系统,并在需要时解压缩。可以使用[SourceDir]属性或[OriginalDatabase]属性OriginalDatabase property
告知副本MSI位置的位置您解析该位置以获取路径,然后将副本复制到TARGETDIR位置。
答案 1 :(得分:0)
我实际上已成功更新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中记录了向MSI添加CAB文件的过程:Including a Cabinet File in an Installation。相关 - 正如我所说,但绝对可能。正如您将看到Media表中CAB名称开头缺少#
标志表示外部CAB文件。
所以我想,简而言之:
Component table
中添加一个新的相应条目。Media table
添加新行,在LastSequence
列中指定您为该文件设置的数字。将cabinet文件的名称添加到Cabinet
。请确保不要在CAB名称前加上#
。我希望我有时间测试这一切,但我没有。这让我想到了下一点:
当我看到这样的问题时,我总是问自己:这些文件中的内容是什么?它们是否是“琐碎的设置”,实际上可能是默认设置而不是配置文件中的硬编码?这很多次都为我节省了很多工作。
对于MSI和传统样式安装程序,设置和数据文件的部署始终存在问题。我对这些文件的部署理念是将您安装的内容视为“只读”,然后将它们复制到每个用户位置,或者在应用程序启动时将它们设置在HKCU中,使用一些获取适当值的合理过程(来自写入的设置)在安装期间到HKLM,从用户检索,从互联网检索等...)。请参阅此主题的更长答案:Create folder and file on Current user profile, from Admin Profile。在我看来,最好的方法是从在线数据库中检索启动时的设置(正如您将看到的那样,如果您阅读了该链接的内容),但这涉及到。