windows C++系列- 独立应用程序和并行程序集

独立应用程序和并行程序集是一种 Microsoft Windows 解决方案,可减少 Windows 客户端应用程序中的版本控制冲突。 借助 Windows,应用程序开发人员可以生成完全自我描述且不受注册表更改、其他应用程序或系统上运行的其他程序集版本影响的独立应用程序。 部署后,应用程序作者和管理员可以使用清单来管理并行程序集的共享,无论是全局还是每个应用程序。 客户受益于独立应用程序,这些应用程序更稳定、更新更可靠。

独立应用程序和并行程序集共享可用于开发安全共享操作系统程序集的应用程序。 开发人员可以使用此技术来纠正由于共享程序集版本不兼容而导致的 DLL 版本控制冲突。

如果应用程序必须一致地获取已测试的组件版本,则可以隔离应用程序,以便它始终在用户计算机上使用组件的测试版本运行。独立应用程序和并行程序集用于开发桌面样式应用程序。

Visual Studio 支持 Windows 客户端应用程序的部署模型,其理论基础是独立应用程序和并行程序集。 默认情况下,Visual Studio 将所有本机 C/C++ 应用程序都作为独立应用程序来生成,这些应用程序使用清单来描述其在 Visual C++ 库上的依赖关系。

将 C/C++ 程序生成为独立应用程序具有一系列的好处。 例如,当其他 C/C++ 应用程序安装或卸载 Visual C++ 库时,不会影响独立应用程序。 仍可将独立应用程序使用的 Visual C++ 库重新发布到应用程序的本地文件夹中或通过安装重新发布到本机程序集缓存 (WinSxS);但是,通过使用 发布者配置文件,为已部署的应用程序提供 Visual C++ 库服务时会更加简单。 借助于独立应用程序部署模型,更加容易确保在特定计算机上运行的 C/C++ 应用程序使用 Visual C++ 库的最新版本,同时使系统管理员和应用程序的作者仍可以控制应用程序与其依赖 DLL 的显式版本绑定。

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

如果应用程序的所有组件都是 并行程序集 ,则该应用程序被视为 独立应用程序。 并行程序集是指应用程序在运行时可部署在一起并可使用的资源的集合,如一组 DLL、Windows 类、COM 服务器、类型库或接口。 通常,并行程序集是一个或若干个 DLL。

共享或私有

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

清单和搜索顺序

独立应用程序和并行程序集均由 清单描述。 清单是一个 XML 文档,既可以是外部文件,也可以作为资源嵌入到应用程序或程序集内。 独立应用程序的清单文件用于管理共享的并行程序集的名称和版本,应用程序应当在运行时绑定到这些程序集。 并行程序集的清单用于指定并行程序集的名称、版本、资源和依赖程序集。 对于共享并行程序集,其清单安装在 %WINDIR%\WinSxS\Manifests\ 文件夹中。 对于私有程序集,建议将其清单作为 ID 为 1 的资源包含在 DLL 中。 还可以为私有程序集提供与 DLL 相同的名称。 

执行时,Windows 将使用应用程序清单中的程序集信息,以搜索并加载相应的并行程序集。 如果独立应用程序指定了程序集依赖项,则操作系统会首先在 %WINDIR%\WinSxS\ 文件夹中的本机程序集缓存中的共享程序集中搜索程序集。 如果未找到所需的程序集,则操作系统会在应用程序目录结构的文件夹中搜索私有程序集。 

更改依赖项

通过修改 发行者配置文件 和 应用程序配置文件部署应用程序之后,可以更改并行程序集依赖项。 发行者配置文件(也称为发行者策略文件)是一个 XML 文件,它对应用程序和程序集进行全局重定向,使其从使用并行程序集的一个版本变为使用该程序集的另一个版本。 例如,在为并行程序集部署 Bug 修复或安全修复并且要将所有应用程序重定向为使用已修复的版本时,可更改依赖项。 应用程序配置文件是一个 XML 文件,它对特定的应用程序进行重定向,使其从使用并行程序集的一个版本变为使用该程序集的另一个版本。 你可使用应用程序配置文件以重定向特定的应用程序,使其使用不同于在发行者配置文件中定义的并行程序集的版本。

Visual C++ 库

在 Visual Studio 2005 和 Visual Studio 2008 中,可再发行库(如 ATL、MFC、CRT、标准 C++、OpenMP 和 MSDIA)已作为共享的并行程序集部署到本机程序集缓存中。 在当前版本中,可再发行库使用集中部署。 默认情况下,使用 Visual Studio 生成的所有应用程序在生成时都将清单嵌入到最终二进制文件中,该清单将描述此二进制文件在 Visual C++ 库中的依赖项。  对于静态链接到自身使用的库的应用程序,或链接到使用本地部署的库的应用程序,清单不是必需的。 

生成 C/C++ 并行程序集

并行程序集是指应用程序在运行时可使用的资源的集合,如一组 DLL、Windows 类、COM 服务器、类型库或接口。 在程序集中重新打包 DLL 的主要优点是,应用程序可以同时使用多个版本的程序集,并且对于更新版本,可以处理当前已安装的程序集。

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

默认情况下,使用 Visual Studio 生成 DLL 时,会将应用程序清单作为 ID 等于 2 的 RT_MANIFEST 资源嵌入。 正如对可执行文件一样,此清单描述此 DLL 对其他程序集的依赖关系。 这假设 DLL 不是并行程序集的一部分,并且依赖于此 DLL 的应用程序不会使用应用程序清单加载它,而是依赖于操作系统加载程序在系统路径上查找此 DLL。

使用应用程序清单的 DLL 将清单作为 ID 等于 2 的资源嵌入,这一点非常重要。 如果在运行时动态加载 DLL(例如,使用 LoadLibrary 函数),则操作系统加载程序会加载 DLL 清单中指定的依赖程序集。 在 LoadLibrary 调用期间,不会检查 DLL 的外部应用程序清单。 如果未嵌入清单,则加载程序可能会尝试加载不正确的程序集版本,或找不到依赖程序集。

一个或多个相关 DLL 可以通过对应程序集清单重新打包到并行程序集中,该清单描述组成该程序集的文件以及该程序集对其他并行程序集的依赖关系。

如果程序集包含一个 DLL,则建议将程序集清单作为 ID 等于 1 的资源嵌入此 DLL 中,并为私有程序集提供与 DLL 相同的名称。 例如,如果该 DLL 的名称为 mylibrary.dll,则清单的 <assemblyIdentity> 元素中使用的名称特性的值也可以是 mylibrary。 在某些情况下,当库的扩展名不是 .dll 时(例如,MFC ActiveX 控件项目会创建 .ocx 库),可以创建外部程序集清单。 在这种情况下,程序集及其清单的名称必须与于 DLL 的名称不同(例如,MyAssembly、MyAssembly.manifest 和 mylibrary.ocx)。 但仍建议将此类库重命名为具有扩展名 .dll,并将清单作为资源嵌入,以减少此程序集的将来维护成本。 

此更改可能会允许将对应 DLL 作为私有程序集部署在应用程序本地文件夹中,或作为共享程序集部署在 WinSxS 程序集缓存中。 若要实现此新程序集的正确运行时行为,必须遵循几个步骤;有关创建并行程序集的准则中介绍了这些步骤。 正确创作程序集之后,可以将它部署为共享程序集,或是作为私有程序集与依赖于它的应用程序一起部署。 将并行程序集作为共享程序集进行安装时,可以按照在 Windows XP 上安装 Win32 程序集以便并行共享中所述的准则或使用合并模块。 将并行程序集作为私有程序集进行安装时,只能将对应 DLL、资源和程序集清单作为安装过程的一部分复制到目标计算机上的应用程序本地文件夹,从而确保加载程序在运行时可以找到此程序集。 另一种方法是使用 Windows Installer,并遵循在 Windows XP 上安装 Win32 程序集以实现应用程序的专用中所述的准则。

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值