第 7 章 — 部署和更新智能客户端应用程序
智能客户端应用程序在客户端计算机上执行本地处理,因此需要将它们部署到这些计算机上。过去,在客户端计算机上长期部署、更新、维护和卸载应用程序非常困难而且存在很多问题。由于
COM 的缘故,几个问题使得向客户端计算机部署应用程序变得非常困难,包括:
与注册表紧密耦合的应用程序。安装 COM 应用程序要求在注册表中注册类和类型库。
非独立的应用程序。除了必须在注册表中注册类和类型以外,应用程序通常还包括位于硬盘上的共享文件以及注册表中包含的配置设置。应用程序不是独立的;相反,它的构成部分分布在计算机中的不同区域。
无法并列部署的组件。无法将同一 DLL 的两个不同版本部署到同一目录中。
这些问题构成了有效部署和维护客户端应用程序的巨大障碍。
Microsoft .NET Framework 具有一些能够简化部署 .NET Framework 应用程序的过程的功能。这些功能包括:
自我描述的程序集。.NET Framework 程序集包含元数据,以描述引用的所有程序集的版本信息、类型、资源和详细信息(以及其他内容)。这意味着它们不依赖于注册表。
版本控制和并列支持。.NET Framework 对于版本控制具有大量的支持,允许您安装多个版本的应用程序和多个版本的
.NET Framework,以便它们能够并列运行。
相互隔离的应用程序。可以将 .NET Framework 程序集部署到应用程序目录,以供该特定应用程序使用,并且默认情况下将其与其他应用程序单独保存并隔离。这意味着不需要将程序集部署到
Windows 目录或者将其显式注册到注册表中,从而降低了在安装其他应用程序时改写或删除这些程序集的可能性。
全局程序集缓存。如果您希望在同一台计算机上的不同应用程序之间共享代码,则可以将组件部署到全局程序集缓存。全局程序集缓存允许同一程序集的不同版本共存。在引用全局程序集缓存中的程序集时,必须指定程序集的完全限定名,包括公钥标记和版本号。这有助于防止无意中使用组件的不同版本。
针对具有强名称的程序集的编译时程序集的默认运行时绑定。默认情况下,如果程序集具有强名称,则
.NET Framework 会将其绑定到其从属程序集的确切版本。这会降低应用程序脆弱性,因为 .NET Framework
加载的是构建和测试该应用程序时的确切的程序集版本。如果需要,可以显式覆盖该行为。
总而言之,上述更改有助于解决许多过去曾经困扰胖客户端应用程序的部署和维护的基础问题。
部署智能客户端应用程序
当您设计智能客户端应用程序时,应该考虑将如何部署这些应用程序。只要有可能,您都应该努力将任何安装的系统影响降至最低限度。这样做使您可以更紧密地跟踪对应用程序进行的任何更改,并且减轻更新和卸载应用程序的问题。但是,有时您将需要执行更为复杂的安装,例如,当您重用非托管代码组件时,或者当您需要在注册表中安全地存储敏感数据时。
当您部署智能客户端应用程序时,可以使用多种选择。这些选择包括:
无接触部署。使用该方法时,您可以将文件复制到 Web 服务器,然后当用户单击相应的链接时,.NET
Framework 会自动将应用程序及其从属程序集下载到客户端。
带有应用程序更新存根的无接触部署。使用该方法时,您可以使用无接触部署下载应用程序存根,该存根随后会将应用程序的其余部分下载到本地硬盘。
从文件共享运行代码。使用该方法时,您可以将文件复制到文件共享,然后从该共享中运行应用程序。
Xcopy。使用该方法时,您可以将文件直接复制到客户端。.NET Framework
允许应用程序及其所有从属程序集位于单个目录结构中,因此您无须在客户端上注册任何组件。
Windows 安装程序软件包。使用该方法时,您可以将应用程序的文件打包到
Windows 安装程序软件包中,然后将该软件包安装到客户端上。
每种方法都有其自己的优点和缺点。要帮助确定最适合您的环境的部署方法,您应该更加详细地分析每种方法。
无接触部署
无接触部署使用户可以通过使用指向应用程序的 URL 链接来访问您的位于 Web 服务器上的应用程序。要使用无接触部署来部署应用程序,您只需要将适当的文件复制到
Web 服务器。当用户通过使用 URL 链接浏览到应用程序的位置时,Microsoft Internet Explorer
将下载并运行该应用程序。应用程序及其从属程序集将被使用 HTTP 下载到客户端,并且被存储在名为程序集下载缓存的特殊位置。当
.NET Framework 确定是否需要下载 Web 服务器上的程序集时,将只检查该文件上的日期-时间戳,而不会检查程序集版本号。如果服务器上的程序集所具有的日期-时间戳不比客户端上的晚,则不会下载这些程序集。
如果您使用无接触部署来部署您的智能客户端应用程序,则需要向用户提供指向 Web 服务器上的应用程序位置的
URL。使用该方法时,客户端计算机上不需要任何安装程序 — 所有代码都将根据需要下载。每当 Web 服务器上发生更改时,都会自动更新您的应用程序。如果文件已经更改,则会根据需要下载较新的版本,就像使用普通的
Web 浏览一样。
无接触部署依靠 .NET Framework 的能力与 Internet Explorer 5.01 或更高版本交互,以检查是否有所请求的
.NET 程序集。在请求期间,会将可执行文件下载到下载缓存中。然后,一个名为 IEExec 的进程将在 .NET
Framework 的代码访问安全基础结构提供的安全隔离环境中启动应用程序。
从文件共享运行代码
从文件共享运行代码类似于无接触部署,不同之处在于您向用户提供文件共享而不是 URL,以便其部署和运行应用程序。从文件共享运行的代码按需下载,并且在适当的时候执行。因为该代码是从网络运行的,所以它将作为不完全受信任的应用程序运行,而且,除非您更改了客户端上的安全策略,否则它通常从本地
Intranet 运行并且会获得本地 Intranet 权限集。
从文件共享运行代码具有无接触部署的许多优点和缺点,尽管代码不像无接触部署那样缓存在客户端上。因为从文件共享运行代码具有一些安全限制,所以该方法通常并不适合于部署智能客户端应用程序。
注像无接触部署一样,您可以采用将从文件共享运行代码与自动更新存根结合起来的混合式方法。有关详细信息,请参阅本章前面的“带有应用程序更新存根的无接触部署”。
Xcopy 部署
Xcopy 部署要求将应用程序包含的所有文件复制到客户端计算机,以便运行该应用程序。智能客户端应用程序通常只包含位于目录层次结构中的一个或多个可执行文件、一个或多个
DLL 以及一个或多个配置文件。通过将上述所有文件复制到另一台计算机,您就实质上安装了该应用程序。要卸载该应用程序,只需将所有文件从计算机中删除即可。
如果为安装应用程序只需要修改文件系统,则 Xcopy 方法可能是最佳选择。但是,因为您无法对安装过程进行编程控制,所以
Xcopy 方法不 允许您执行下列操作:
? 将程序集部署到全局程序集缓存(以及维护引用)
? 部署 COM 对象
? 部署要求注册或者进行其他注册表更改的组件
? 与 Windows 外壳程序集成
如果您的应用程序要求附加的安装步骤,则您或许会在复制文件之后手动执行上述步骤。例如,如果您需要修改注册表,则可以在目标计算机上编辑注册表或者导入
*.reg 文件,以确保使适当的设置就绪。如果您需要将程序集部署到全局程序集缓存,则可以使用带 /ir 开关的
Gacutil.exe 实用工具,以便将程序集安装到带有跟踪引用的全局程序集缓存中。可以通过使用 /ur 开关在卸载程序集时删除这些引用。
注您还可以在 Windows 资源管理器中使用拖放操作将共享程序集移动到全局程序集缓存文件夹中。但是,您应该避免使用该方法,因为该方法没有实现引用计数。没有引用计数,其他应用程序的卸载例程可能导致您的应用程序所需的程序集被从全局程序集缓存中删除。
Xcopy 部署适合于某些智能客户端应用程序,但是,在许多情况下,因为需要执行一些附加步骤才能使应用程序正常工作,所以使得这一看起来简单的方法变得过于费力。
Windows 安装程序软件包
您可以将要安装的应用程序打包为 Windows 安装程序软件包。该方法使您能够不受限制地在目标计算机上安装任何应用程序,尽管应用程序在运行时会受到安装它的最终用户的安全上下文的限制。
Windows 安装程序软件包十分灵活和强大,因此您可以使用它们安装那些对客户端进行大量配置更改的非常复杂的应用程序。然而,它们也适合于那些具有简单得多的安装要求的应用程序。即使您已经将应用程序设计为在安装时对客户端具有最低限度的影响,您也应该考虑使用
Windows 安装程序软件包,因为它们通过在 Start 菜单和桌面上添加图标以及向 Control Panel
中的 Add or Remove Programs 项目中添加应用程序,与 Windows 外壳程序集成。这一集成使您能够有效地控制安装以及在需要时卸载应用程序。
选择正确的更新方法
在某些情况下,您选择的更新方法由您为应用程序选择的部署方法限定。但是,最适当的方法通常由您要部署的更新的性质决定。例如,您可能只是复制新文件以覆盖旧文件,或者您可能希望更新的应用程序与旧应用程序并列运行。更新可能涉及到将新的程序集添加到全局程序集缓存,或者更改注册表中的配置信息。如果您要部署对具有强名称的程序集的更新,则更新将变得更为复杂,因为调用具有强名称的程序集的每个程序集都将在调用中使用版本号。
表 7.2 概述了可用于更新应用程序的选择以及每个选择所支持的功能。
表 7.2 智能客户端应用程序的更新方法
非超级用户更新 |
是 |
取决于应用程序的要求 |
是 |
否 |
取决于应用程序的要求和应用程序分发机制 |
集中式更新管理 |
是 |
是 |
是 |
否 |
取决于应用程序分发机制 |
在运行应用程序时下载更新 |
是 |
是 |
否 |
否 |
否 |
联合的更新基础结构 |
否 |
是 |
否 |
否 |
是 |
逐个用户/组进行更新 |
是 |
是 |
否 |
否 |
取决于应用程序分发机制 |
事务性更新 |
否 |
是 |
否 |
否 |
是 |
内置的版本控制支持 |
否 |
否 |
否 |
否 |
是 |
|