Windows Installer是微软Windows操作系统自带的一个软件安装和配置服务,其实现了软件安装的业务逻辑:如何安装软件?如何修改注册表键值?如何创建快捷方式?如何操作网站目录或注册服务?等等。Windows Installer技术由两部分组成:客户端安装程序服务(Msiexec.exe)和Microsoft软件安装包文件(MSI)。
Windows Installer是从一个数据库中来获取软件安装的相关信息。MSI文件就是一个Windows Installer的数据库,它包含了安装一种产品所需信息、安装(或卸载)程序所需的指令和数据;它将程序的组成文件和功能关联起来;它还包含有关安装过程本身的信息,如目标文件夹路径、系统依赖项、安装选项和控制安装过程的属性。
既然MSI是一个数据库,那么它就应该由多个关系表来组成。下面我们就简单地介绍MSI的几个重要的表。
表格 1 MSI的几个重要表说明
表名 |
说明 |
Directory |
指定了产品的目录结构,包括源目录结构和目标目录结构。 |
Component |
指定了产品的基本组件结构。 |
Feature |
Component的组合就称为Feature,是用户选择安装的可视部件。 |
File |
指定了需要安装到目标目录的文件。 |
ShortCut |
记录了产品需要在目标计算机上安装快捷方式所需的信息。 |
Register |
记录了产品需要在目标计算机上注册的注册表键值信息。 |
Property |
记录了产品安装过程中所需的属性值。 |
Feature和Component是软件安装中非常重要的两个概念。Feature和Component都可以翻译为组件,两者的区别可以说是:Feature是逻辑上的而Component是物理上的。Feature是应用或产品所有功能的一个子集,用户可以独立地选择是否安装。Component是产品或应用的最小组成单元,它可以由一个文件,或一个快捷方式,或一个注册表键值,或它们的组合来组成。
Feature是由Component组成的。Feature具有树状嵌套结构,最大深度为16。在安装的过程中,可以由用户来选择是否安装某个Feature。若父Feature没有被选择,则子Feature也不会被安装。
Component是产品或应用的一小片,每一个要安装的Component都要由一个唯一的GUID值来标识,以便Windows Installer进行跟踪。若某个Component没有GUID值,则安装时不会被安装注册,无GUID的Component一般用于只在安装时的功能实现,例如删除某些临时文件等。
Directory表指定了产品安装的目录结构,包括目标目录结构和源目录结构。Directory表有三个表项:标识符ID、父目录Directory_Parent和DefaultDir。表项Directory_Parent指向该目录的父目录,而通过表项ID和DefaultDir的值来确定目标目录结构和源目录结构。
目录结构必须有且仅有一个根目录,这个根目录的标识符必须指定为TARGETDIR(TARGETDIR是Windows Installer预定义的属性,其值可以通过命令行或用户界面进行设置),而根目录的SourceDir则必须指定为SourceDir(SourceDir默认的属性值为.msi文件所在的路径)。如果属性TARGETDIR的值被指定了,则目标根目录为TARGETDIR的属性值;若该属性未有值,则目标根目录为Windows Installer预定义属性ROOTDRIVE的值。而源根目录则为SourceDir的属性值。
对于非根目录,若Directory的标识符ID中指定的属性被定义了,则该属性的值即为目标目录,否则取DefaultDir表项中的值作为目标父目录下的一个子目录。而源目录则是将DefaultDir表项中指定的值作为源父目录的一个子目录。
每个安装包必须要有五个必需属性(Required Properties):ProductCode、ProductLanguage、Manufacturer、ProductName和ProductVersion。
表格 2 五个必需属性
属性名 |
说明 |
ProductCode |
唯一的、大写的GUID值,用于标识要安装的产品。 |
ProductLanguage |
指示了用户界面上除写入数据库的字符串外的其余字符串所用的语言的数字ID(如1033、2046)。 |
Manufacturer |
指示产品生产厂商的字符串值。 |
ProductName |
产品名称。 |
ProductVersion |
产品版本号,版本号的格式为major.minor.build,其中major和minor最大数字为255,build的最大数字为65535。 |