“引导程序”是一般安装程序,可配置为引导几乎所有打包为 Windows Installer 文件或可执行程序的可再发行组件。它通过一组简单的 XML 清单进行编程,该清单指定引导程序管理组件安装所需的所有元数据。引导程序不规定应用程序必须使用何种安装程序技术(Windows Installer 或 ClickOnce)。
当用户启动 Setup.exe 时,它首先检测是否已安装所有系统必备。如果缺少某个系统必备,则引导程序会显示一个安装对话框,列出缺少的组件并显示其许可协议。否则,如果检测到所有的系统必备,引导程序则只需启动应用程序的安装程序。
用户接受许可协议后就会开始下载和安装过程。安装完所有的系统必备后,引导程序将关闭应用程序自身的安装过程。
创建自定义程序包
有些情况下,您不需要为可再发行组件创建程序包。通常,您只需要为共享组件或系统组件生成程序包,这包括将文件安装到 GAC 中、执行全局注册或组成 Windows Service。
您应询问控件提供者是否可以在应用程序中附带可再发行文件。如果简单的复制操作即足以重新发布系统必备组件(例如,如果它没有任何依赖项),则无需创建程序包。只需确保文件已包含在安装程序中,或设置为“复制本地”(“属性视图”中文件的 Copy 属性应设置为 True)。
您还应确定是否必须使用安装程序。如果是,请使用引导程序程序包。
若要创建新的组件程序包,您需要提供:
-
EXE 或 MSI 文件形式的可再发行组件。
-
产品清单 product.xml,包含程序包的所有非特定语言的元数据。它包含可再发行组件的所有本地化版本通用的元数据。
-
程序包清单 package.xml,包含特定语言的元数据;它通常包含本地化的错误消息。必须至少为组件的每个本地化版本提供一个程序包清单。
您必须手动创建清单文件,清单文件包含的元数据必须遵循 .NET Framework SDK 中的“程序包架构元素”描述的特定架构。有关架构参考的信息,请参见产品和包架构引用。Visual Studio 集成的安装程序生成器会在生成时验证清单文件。
可使用 DependsOnProduct 架构元素在这些清单中指定程序包之间的依赖关系。依赖关系的一个示例是,安装 Visual J# 运行库需要首先安装 .NET Framework。
然后您必须将产品和程序包清单文件(以及可再发行文件)复制到 Visual Studio 为可再发行组件程序包保留的特定文件夹中:
\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper
若要编写将可再发行组件及其清单复制到此文件夹的安装程序,可以以编程方式从下列注册表项获取 Bootstrapper 文件夹的位置(按照下面的顺序读取注册表项):
HKCU\Software\Microsoft\GenericBootstrapper\1.0\Path HKLM\Software\Microsoft\GenericBootstrapper\1.0\Path
如果这两个项都不存在,则读取注册表项获取 SDK 的安装位置:
HKLM\Software\Microsoft\.NET Framework\sdkInstallRootv2.0
每个可再发行组件均位于程序包目录下它们自己的子文件夹中。然后将产品清单和可再发行文件放入此子文件夹中。组件的本地化版本以及程序包清单放置在根据“区域性名称”(请参见 CultureInfo 中的表)命名的子文件夹中。
这些文件一旦复制到 Bootstrapper 文件夹中,它们将自动出现在 Visual Studio 的“系统必备”对话框中,以便开发人员通过选中复选框对它们进行选择。
有关使用引导程序配置安装的更多信息,请参见位于 http://msdn.microsoft.com/msdnmag/issues/04/10/Bootstrapper/ 上的 MSDN 文章“Use the Visual Studio 2005 Bootstrapper to Kick-Start Your Installation”(使用 Visual Studio 2005 引导程序开始安装)。
使引导程序程序包可再发行组件与应用程序安装保持分离
一般规则是,应使引导程序程序包可再发行组件中的所有组件与使用这些组件的应用程序保持分离。例如,假设您有一个包含组件 Acme.DataWidgets.dll 的名为 Acme.DataWidgets.msi 的引导程序程序包。Acme.DataWidgets.dll 在开发时不应出现在项目的 bindir 目录中,并且不应部署到应用程序的安装程序程序包中。
因此,建议您将引导程序组件安装到开发计算机上的 GAC 中,并且最好使用同一核心引导程序程序包可再发行组件安装程序。这可防止在开发时将引导程序组件复制到项目的 bindir 目录中。另外,建议您定义一个 RedistList 文件来介绍引导程序可再发行组件程序包中包含的所有程序集。这可防止在任何应用程序部署项目中包含引导程序组件。RedistList 文件只需安装在开发人员的计算机上。
若要达到这一目的,请在 .NET Framework 目录 (\WINDOWS\Microsoft.NET\Framework) 的 RedistList 文件夹中创建一个可再发行组件列表。
可再发行组件列表是一个应使用下面的格式命名的 XML 文件:company_name + component_name + RedistList.xml。这样,如果组件名为“Datawidgets”,制作者为“Acme”,则命名为 Acme.DataWidgets.RedistList.xml。可再发行组件列表的内容的示例可能类似如下所示:
<?xml version="1.0" encoding="UTF-8"?> <FileList Redist="Acme.DataWidgets" > <File AssemblyName="Acme.DataGrid" Version="1.0.0.0" PublicKeyToken="b03f5f7f11d50a3a" Culture="neutral" ProcessorArchitecture="MSIL" InGAC="true" /> </FileList>
向“系统必备”对话框添加程序包
“系统必备”对话框使您可选择应用程序在安装前所需的组件。Visual Studio 包含许多标准的系统必备。但是,您可以添加其他 Microsoft 组件或第三方组件作为系统必备。为此,您必须按上文所述创作产品和程序包清单。
在“系统必备”对话框中,“请选择要安装的系统必备组件”列表显示可安装的系统必备程序包。此列表中程序包的顺序取决于清单中指定的依赖关系,并指定程序包的安装顺序。
向引导程序中添加一般程序包后,它会作为“MyPackage”出现在“系统必备”对话框中。Visual Studio 不会自动选择要安装的程序包。
对于 ClickOnce 项目,Visual Studio 建议通过在“请选择要安装的系统必备组件”中默认选中“.NET Framework”复选框为所有项目类型提供 .NET Framework。它还建议为 J# 项目提供 J# 运行库。
对于 Windows Installer 项目,如果当前项目为 Setup 项目或 Websetup 项目,则默认情况下会选中“.NET Framework”复选框。如果在生成时既没有选择 .NET Framework,也没有选择 Windows Installer 程序包,则会发出生成警告。