部分程序集引用

更新:2007 年 11 月

完全的程序集引用包括程序集的文本名称、版本、区域性和公钥标记(如果程序集具有强名称)。如果您引用的程序集是公共语言运行库的组成部分或者位于全局程序集缓存中,则需要完全的程序集引用。也可以通过仅提供部分信息(如仅指定程序集名称),动态地引用程序集。

不推荐使用部分程序集引用,因为它会导致很多版本控制问题:

  • 程序集的版本可能不向后兼容。例如,您的代码可能使用 1.6 版的程序集,但由于部分程序集引用,您可能会得到一个具有不兼容更改的较新版本。

  • 程序集的版本可能不向前兼容。例如,您的代码可能使用 1.6 版的程序集,但由于部分程序集引用,您可能会得到一个缺少必需代码的较旧版本。

  • 如果新版本不兼容,则安装新版本程序集的应用程序会影响使用部分程序集引用的应用程序加载程序集。

由于出现版本控制问题的可能性非常大,因此在 .NET Framework 2.0 版中,LoadWithPartialName 方法被标记为已过时。

进行部分程序集引用

可以使用以下任一方式在代码中对程序集进行部分引用:

0a7zy9z5.alert_note(zh-cn,VS.90).gif说明:

LoadWithPartialName 方法在 .NET Framework 2.0 版中已过时。

使用 LoadWithPartialName 方法可以使绑定进程多样化。例如,如果使用强名称请求程序集绑定,但在引用中没有包含公钥,则必须确保绑定的程序集来自预期的发行者。另外,不包含公钥标记的引用并不受版本策略的限制,所以从不检查应用程序配置文件和计算机配置文件。当希望获取某个程序集的最新版本时,使用 LoadWithPartialName 方法进行部分引用最为有效。

使用 LoadWithPartialName 方法的部分引用

0a7zy9z5.alert_note(zh-cn,VS.90).gif说明:

LoadWithPartialName 方法在 .NET Framework 2.0 版中已过时。

LoadWithPartialName 方法的调用必须至少包括程序集的文本名称,但还可以包括公钥标记、版本或区域性。由于您使用的是只需要部分引用的方法,因此不必包括完全引用信息(名称、版本、区域性,如果适用还有公钥标记)。

当使用 LoadWithPartialName 方法部分引用程序集时,运行库使用特定规则定位所引用的程序集。这些规则包括:

  1. 运行库在应用程序配置文件的 <qualifyAssembly> 元素中检查有关引用的限定信息。如果找到了有效项,则绑定继续进行,与对任何完全引用进行的操作一样。

  2. 然后,运行库会在应用程序库目录下搜索与指定程序集文本名称匹配的程序集。如果找到了匹配的程序集,运行库就会使用该程序集。

  3. 如果在应用程序目录中未找到匹配的程序集,则运行库会在全局程序集缓存中搜索该程序集。如果在部分引用中指定了公钥标记、版本或区域性,则运行库会尝试精确匹配该值。如果没有指定版本,则运行库会尝试用匹配其他指定条件的最高版本号定位程序集。如果没有指定区域性或公钥标记,则运行库行为是未定义的。

    例如,假定调用了 Assembly.LoadWithPartialName("math, Version 5.0.0.0"),并且全局程序集缓存的内容如下所示:

    math,version=5.0.0.0,publicKeyToken=11111111,culture=de
    math,version=5.0.0.0,publicKeyToken=22222222,culture=en
    

    调用的结果是未定义的。运行库会选择它遇到的第一个程序集。

    再举个例子,假定调用了 Assembly.LoadWithPartialName("math"),并且全局程序集缓存的内容如下所示:

    math,version=5.0.0.0,publicKeyToken=11111111,culture=neutral
    math,version=6.0.0.0,publicKeyToken=22222222,culture=neutral
    

    调用的结果被绑定到数学程序集,版本为 6.0.0.0。

    最后再举个例子,假定调用了 Assembly.LoadWithPartialName("math,publicKeyToken=11111111"),并且全局程序集缓存的内容如下所示:

    math,version=5.0.0.0,publicKeyToken=11111111,culture=neutral
    math,version=6.0.0.0,publicKeyToken=22222222,culture=neutral
    

    调用的结果被绑定到数学程序集,版本为 5.0.0.0。

带有限定信息的部分引用

您还可以使用某一方法(如 System.Reflection.Assembly.Load)进行动态引用并仅提供部分引用,但随后要在应用程序配置文件中使用 <qualifyAssembly> 元素限定该引用。该元素使您可以在应用程序配置文件中而不是在代码中提供完全引用信息(名称、版本、区域性,如果适用还有公钥标记)。

0a7zy9z5.alert_note(zh-cn,VS.90).gif说明:

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

请参见

概念

运行库如何定位程序集

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

第 1 步:检查配置文件

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

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

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