VS2005 独立应用程序和并行程序集的概念

大多数情况下,Visual C++ 应用程序的部署都是用 Windows Installer 部署来完成的。有关 Visual Studio 内支持的部署方法以及替换方法的更多信息,请参见 Windows Installer 部署概述和其他部署方法。在 Visual Studio 2005 中,不支持 Visual C++ 本机应用程序的 ClickOnce 部署;但是,可以在命令行上通过 ClickOnce 部署 Visual C++ 应用程序。有关更多信息,请参见 Visual C++ 应用程序的 ClickOnce 部署

Visual C++ 库是并行程序集

Visual Studio 2005 将 Visual C++ 库安装为共享并行 (Side-by-Side) 程序集。默认情况下,用 Visual Studio 2005 生成的所有应用程序都生成为带有 manifest(作为资源嵌入或作为外部文件伴随最终二进制文件)的 isolated applications。为了确保 Visual C++ 应用程序能在未安装 Visual C++ 的计算机上运行,可能必须与该应用程序一起重新发布 Visual C++ 程序集并确保它们安装在目标计算机上。

重新发布 Visual C++ 库

建议采用以下两种方式来重新发布 Visual C++ DLL。首先,可以使用 Visual C++ 可再发行的合并模块,将 Visual C++ 程序集安装为共享的并行程序集。或者,可以使用在 Program Files\Microsoft Visual Studio 8\VC\Redist 目录中提供的文件,将特定的 Visual C++ 程序集安装为应用程序的私有程序集。

Note注意

在 Windows Server 2000、Windows 95 和 Windows 98 上,要重新发布 Visual C++ 库,只能使用所建议的受支持的方式,即,通过使用可再发行的合并模块。

当使用可再发行的合并模块安装 Visual C++ 程序集时,程序集将作为共享的并行程序集部署到本机程序集缓存(WinSxS 文件夹)中。访问此文件夹要求 Installer 应用程序由具有管理员权限的用户来运行。

如果安装程序由不具备管理权限的用户运行,则安装程序将无法部署 Visual C++ 程序集,而且应用程序将无法运行。同样,某些产品可能允许基于每个用户进行安装,但是合并模块会将库安装到共享位置中并影响系统的所有用户。对于这两个方案及类似的方案,受支持的技术是将必需的程序集作为特定用户的应用程序的私有并行程序集安装。

使用此技术,就可以将具有 DLL 和依赖程序集清单的文件夹复制到应用程序的本地文件夹。当执行应用程序时,操作系统的加载程序仍首先在 WinSxS 文件夹中查找依赖程序集;但是,当无法找到相应的程序集时,该加载程序会从该子目录中加载私有程序集。重新发布 Visual C++ 文件中提供了有关此操作的更多详细信息。

必需的清单

不支持重新发布在没有清单的情况下生成的 C/C++ 应用程序。如果没有将 C/C++ 应用程序绑定到 Visual C++ 库的清单,这些库就不能由该应用程序使用。在 Visual C++ 2005 中生成的所有 C/C++ 程序必须包含描述 Visual C++ 库上的依赖项的清单。这是 Visual Studio 中项目的默认安装以及链接器根据对象代码生成最终二进制文件的默认行为。

如果应用程序要求依赖 DLL 位于应用程序本地文件夹中或者由环境变量指示的文件夹中,则还会容易受到与安全有关的利用的攻击。在部署这样的应用程序之后,为其提供服务会更困难。

使用动态链接(而非静态链接)

不建议重新发布静态链接到 Visual C++ 库的 C/C++ 应用程序。通常错误地认为,将程序静态地链接到 Visual C++ 库可以显著改善应用程序的性能。但是,在几乎所有的情况下,动态加载 Visual C++ 库对性能造成的影响并不显著。而且,静态链接不允许应用程序的作者或 Microsoft 为应用程序及其依赖库提供服务。例如,假定静态连接到特定库的应用程序在具有此库的新版本的客户端计算机上运行。应用程序仍可以从该库的以前版本使用代码,但不会受益于库增强功能(如安全增强功能)。强烈建议 C/C++ 应用程序的作者在决定静态链接到依赖库之前认真考虑维护方案,并尽可能使用动态链接。

 

 

如果应用程序的所有组件都是并行 (Side-by-Side) 程序集,则该应用程序被视为 isolated application。并行程序集是指应用程序在运行时可使用的资源的集合,如一组 DLL、Windows 类、COM 服务器、类型库或接口。通常,并行程序集是一个或若干个 DLL。例如,C 运行时库程序集包含三个 DLL(msvcr80.dll、msvcm80.dll 和 msvcp80.dll),当使用 CRT 库中的函数生成应用程序时可以使用此程序集。

共享或私有

并行程序集可以为共享的或私有的。Shared side-by-side assemblies 可以由多个应用程序使用,这些应用程序在各自的清单中指定对该程序集的依赖项。同时运行的不同应用程序可以共享多个版本的并行程序集。private assembly 是与一个应用程序一起部署的程序集,它由该应用程序独占使用。私有程序集安装在包含该应用程序的可执行文件的文件夹或该文件夹的一个子文件夹中。

清单和搜索顺序

isolated applications 和并行 (Side-by-Side) 程序集均由 manifests 描述。清单是一个 XML 文档,既可以是外部的 XML 文件,也可以作为资源嵌入到应用程序或程序集内部。独立应用程序的清单文件用于管理共享的并行程序集的名称和版本,应用程序应当在运行时绑定到这些程序集。并行程序集的清单用于指定并行程序集的名称、版本、资源和依赖程序集。对于共享并行程序集,其清单安装在 WinSxS\Manifests 文件夹中。对于私有程序集,建议将其清单作为 ID 等于 1 的资源包含在 DLL 中,私有程序集可以与该 DLL 同名。有关更多信息,请参见 Private Assemblies。

执行时,Windows 将使用应用程序的清单中的程序集信息,搜索并加载相应的并行程序集。如果独立应用程序指定了程序集依赖项,则操作系统会首先在 WinSxS 文件夹中的共享程序集中搜索程序集。如果未找到所需的程序集,则操作系统会在应用程序目录结构的文件夹中搜索已安装的私有程序集。有关更多信息,请参见 Assembly Searching Sequence。

更改依赖项

通过修改 Publisher Configuration Files 和应用程序配置文件部署应用程序之后,可以更改并行程序集依赖项。发行者配置文件(也称为发行者策略文件)是一个 XML 文件,它对应用程序和程序集进行全局重定向,使其从使用并行程序集的一个版本变为使用该程序集的另一个版本。下面是一个很好的示例:当为特定的并行程序集部署 bug 修复或安全修复,而且此程序集的发行者可能希望重定向所有的应用程序以使用此程序集的新版本时,可以使用更改依赖项。应用程序配置文件是一个 XML 文件,它对特定的应用程序进行重定向,使其从使用并行程序集的一个版本变为使用该程序集的另一个版本。它可用于重定向特定的应用程序,使其使用不同于在全局发行者配置文件中定义的并行程序集版本。有关更多信息,请参见 Configuration。

Visual C++ 库

在 Visual C++ 2005 中,库(如 ATL、MFC、CRT、标准 C++、OpenMP 和 MSDIA)将作为共享的并行程序集部署到本机程序集缓存中。默认情况下,使用 Visual C++ 2005 生成的所有应用程序在生成时都将清单嵌入到最终二进制文件中,该清单用于描述此二进制文件在 Visual C++ 库中的依赖项。若要了解 Visual C++ 应用程序的清单生成,请参见了解 C/C++ 程序的清单生成

 

side-by-side assembly 是应用程序在运行时可使用的资源的集合,如一组 DLL、Windows 类、COM 服务器、类型库或接口。在 Visual C++ 2005 中,已将 ATL 库、MFC 库、标准 C++ 库和 CRT 库重新打包到若干个并行程序集中,这些程序集可以通过 Visual C++ 应用程序重新发布为共享或私有程序集。有关更多信息,请参见 Visual C++ Libraries as Side-by-Side Shared Assemblies。将 DLL 重新打包到程序集中的主要优点是,应用程序可以同时使用程序集的多个版本,且发布更新时可以为当前已安装的程序集提供服务。

Visual C++ 应用程序可以在它的不同部分使用一个或若干个 DLL。运行时,会将这些 DLL 加载到主进程并执行所需的代码。应用程序依赖操作系统来定位所需的 DLL,了解必须加载的其他依赖 DLL,然后将它们与所需的 DLL 一起加载。在早于 Windows XP 和 Windows 2003 版本的 Windows 操作系统上,操作系统加载程序会在应用程序的本地文件夹或系统路径指定的另一个文件夹中搜索依赖 DLL。在 Windows XP 和 Windows 2003 上,操作系统加载程序还可以使用 manifest 文件搜索依赖 DLL,并搜索包含这些 DLL 的并行程序集。

默认情况下,在使用 Visual Studio 2005 生成 DLL 时,该 DLL 会有一个作为 RT_MANIFEST 资源(ID 等于 2)嵌入的 application manifest。正如可执行文件一样,此清单描述该 DLL 在其他程序集中的依赖项。此处假定此 DLL 不是并行程序集的一部分,且依赖于此 DLL 的应用程序将不会使用应用程序清单加载此 DLL,而是依靠操作系统加载程序在系统路径中查找此 DLL。

Note注意

对于使用应用程序清单的 DLL 来说,将此清单作为资源(ID 等于 2)嵌入其中,是十分重要的。如果在运行时动态加载此 DLL(例如,使用 LoadLibrary 函数),操作系统加载程序将加载 DLL 的清单中指定的依赖程序集。在调用 LoadLibrary 期间,不会检查 DLL 的外部应用程序清单。如果未嵌入此清单,则加载程序可能会试图加载程序集的错误版本,或无法找到依赖程序集。

通过相应的程序集清单,可以将一个或若干个相关 DLL 重新包装到并行程序集中,该清单用于描述构成此程序集的文件、以及此程序集对于其他并行程序集的依赖性。

Note注意

如果程序集包含一个 DLL,建议将程序集清单作为 ID 等于 1 的资源嵌入到该 DLL 中,并且让私有程序集与该 DLL 同名。例如,如果该 DLL 的名称为 mylibrary.dll,则清单的 <assemblyIdentity> 元素中使用的名称属性的值也可以是 mylibrary。在某些情况下,如果库的扩展名不是 .dll(例如,MFC ActiveX 控件项目会创建 .ocx 库),则可以创建外部程序集清单。在此情况下,程序集及其清单的名称必须不同于 DLL 的名称(例如,MyAssembly、MyAssembly.manifest 和 mylibrary.ocx)。但是,仍然建议对这种库重命名,使其扩展名为 .dll,并将清单作为资源嵌入,以减少今后对此程序集的维护成本。有关操作系统如何搜索私有程序集的更多信息,请参见 Assembly Searching Sequence。

此更改允许将相应的 DLL 作为 private assembly 部署到应用程序本地文件夹中,或作为 shared assembly 部署到 WinSxS 程序集缓存中。若要使此新程序集在运行时的行为准确无误,必须执行若干步骤;Guidelines for Creating Side-by-side Assemblies 中对这些步骤进行了描述。正确编写程序集后,可将此程序集作为共享程序集或私有程序集与依赖于它的应用程序一起进行部署。将并行程序集作为共享程序集安装时,可以按照 Installing Win32 Assemblies for Side-by-Side Sharing on Windows XP 中介绍的指南进行操作,也可以使用 merge modules。将并行程序集作为私有程序集安装时,在安装过程中,仅需将相应的 DLL、资源和程序集清单复制到目标计算机上的应用程序本地文件夹中,这样可确保加载程序在运行时可以找到此程序集(请参见 Assembly Searching Sequence)。另一种方法是使用 Windows Installer,并按照 Installing Win32 Assemblies for the Private Use of an Application on Windows XP 中介绍的指南进行操作。

了解 C/C++ 程序的清单生成

manifest 是一个 XML 文档,可以是外部 XML 文件,也可以是嵌入应用程序或程序集内的资源。isolated application 的清单用于管理该应用程序在运行时应该绑定到的共享并行程序集的名称和版本。side-by-side assembly 的清单指定该程序集在名称、版本、资源和其他程序集上的依赖项。

创建独立应用程序或并行程序集的清单有两种方式。第一,程序集的作者可遵循规则和命名要求手动创建清单文件。或者,如果程序仅依赖于 Visual C++ 程序集(如,CRT、MFC、ATL 或其他),则可由链接器自动生成清单。

Visual C++ 库的头文件包含程序集信息,当这些库包含在应用程序代码中时,则链接器使用此程序集信息来生成最终二进制文件的清单。链接器不会将清单文件嵌入到二进制文件中,而只能将其作为外部文件生成。并非在所有的情况下,都可以将清单作为外部文件。例如,建议在私有程序集中嵌入清单。在命令行中生成时(如使用 nmake 生成代码时),可使用清单工具嵌入清单;有关更多信息,请参见命令行上的清单生成。当在 Visual Studio 中生成时,可通过在“项目属性”对话框中设置清单工具的属性来嵌入清单;请参见Visual Studio 中的清单生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值