运行库如何定位程序集

更新:2007 年 11 月

若要成功地部署 .NET Framework 应用程序,必须了解公共语言运行库如何定位和绑定组成应用程序的程序集。默认情况下,运行库试图与生成应用程序使用的程序集的原版本绑定。这种默认行为可以由配置文件设置覆盖。

在试图定位程序集并解析程序集引用时,公共语言运行库将执行若干个步骤。以下几节中对每个步骤进行了解释。当描述运行库如何定位程序集时,通常使用“探测”一词;它是指基于名称和区域性定位程序集时使用的一组试探法。

说明:

您可以使用包含在 Windows 软件开发工具包 (SDK) 中的程序集绑定日志查看器 (Fuslogvw.exe) 来查看日志文件中的绑定信息。

开始绑定

当运行库试图解析对另一个程序集的引用时,就开始进行定位并绑定到程序集的进程。该引用可以是静态的,也可以是动态的。在生成时,编译器在程序集清单的元数据中记录静态引用。动态引用是由于调用各种方法而动态构造的,例如 System.Reflection.Assembly.Load 方法。

引用程序集的首选方式就是使用完全引用,包括程序集名称、版本、区域性和公钥标记(如果存在)。运行库就会按照本节后面描述的步骤,使用这些信息来定位程序集。无论引用是对静态程序集的引用还是对动态程序集的引用,运行库均使用相同的解析过程。

还可通过向调用方法仅提供有关程序集的部分信息的方式(例如仅指定程序集名称),对程序集进行动态引用。在这种情况下,仅在应用程序目录下搜索程序集,不进行其他检查。使用加载程序集(如 System.Reflection.Assembly.LoadSystem.AppDomain.Load)的各种方法中的一种进行部分引用。

最后,您可以使用诸如 System.Reflection.Assembly.Load 之类的方法进行动态引用并只提供部分信息;然后在应用程序配置文件中用 <qualifyAssembly> 元素限定该引用。该元素使您可以在应用程序配置文件中而不是在代码中提供完全引用信息(名称、版本、区域性,如果适用还有公钥标记)。如果要在应用程序目录外完全限定对某个程序集的引用,或者如果要引用全局程序集缓存中的程序集,但又希望方便地在配置文件中而不是在代码中指定完全引用,就可以采用这一技术。

说明:

对于在多个应用程序间共享的程序集,不应使用这种部分引用。因为配置设置是应用于每一应用程序而不是每一个程序集的,所以使用这种部分引用的共享程序集会有这样的要求:使用该共享程序集的每一应用程序都要在其配置文件中具有限定信息。

运行库使用以下步骤来解析程序集引用:

  1. 通过检查适用的配置文件(包括应用程序配置文件、发行者策略文件和计算机配置文件),确定正确的程序集版本。如果配置文件位于远程计算机上,则运行库必须首先定位和下载应用程序配置文件。

  2. 检查程序集名是否以前已被绑定,如果已绑定,则使用以前加载的程序集。如果以前加载程序集的请求失败,则该请求将在不尝试加载程序集的情况下立即失败。

    说明:

    程序集绑定失败缓存是 .NET Framework 2.0 版中的新功能。

  3. 检查全局程序集缓存。如果在其中找到了程序集,则运行库使用该程序集。

  4. 按以下步骤探测程序集

    1. 如果配置和发行者策略不影响原始引用,并且绑定请求是使用 Assembly.LoadFrom 方法创建的,则运行库检查是否存在位置提示。

    2. 如果在配置文件中找到了基本代码,则运行库只检查该位置。如果该探测失败,则运行库确定绑定请求已失败,并且不再进行其他的探测。

    3. 使用探测部分中描述的试探法探测程序集。如果探测后没有找到程序集,则运行库请求 Windows Installer 提供程序集。它用作一个即需即装功能。

      说明:

      不对没有强名称的程序集进行版本检查,并且运行库也不在全局程序集缓存中检查没有强名称的程序集。

请参见

概念

.NET Framework 应用程序的部署方案

第 1 步:检查配置文件

第 2 步:检查以前引用的程序集

第 3 步:检查全局程序集缓存

第 4 步:通过基本代码或探测定位程序集

部分程序集引用

其他资源

部署 .NET Framework 应用程序