11.11 <codeBase>元素
应用程序配置文件也可以配置<codeBase>。<codeBase>元素用于指示CLR查找位于任意位置(例如网络共享点,或者客户端应用程序目录以外的本地目录)的依赖程序集。
注解 当<codeBase>元素的值指向远程计算机的时候,相关程序集将会按需下载到GAC的下载缓存中。我们可以使用gacutil.exe结合/idl选项查看下载缓存中的内容。
由于GAC对部署其中程序集的要求,所以那些通过<codeBase>元素加载的程序集应该具有强名称(否则,CLR无法把远程程序集加载到GAC)。
注解 实际上,<codeBase>元素可以用于探测不具有强名称的程序集。但是,该程序集的位置必须是相对于客户端应用程序目录的(这一点与<privatePath>元素有点儿不同)。
创建控制台应用程序CodeBaseClient,添加对CarLibrary.dll 2.0.0.0版本的引用,然后改写生成的代码如下:
using CarLibrary;
namespace CodeBaseClient
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("***** Fun with CodeBases *****");
SportsCar c = new SportsCar();
Console.WriteLine("Sports car has been allocated.");
Console.ReadLine();
}
}
}
由于CarLibrary.dll被部署在GAC中,所以客户端程序可以正常运行。然而,为了说明<codeBase>元素,我们在C盘下创建一个新的文件夹(C:\MyAsms),然后把CarLibrary.dll的2.0.0.0版本复制到该目录下。
向CodeBaseClient项目添加App.config文件,然后编写以下XML内容(请记住.publickeytoken的值会和读者的有所不同,请到GAC中查看):
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="CarLibrary" publicKeyToken="219ef380c9348a38" />
<codeBase version="2.0.0.0" href="file:///C:\MyAsms\CarLibrary.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
从上面可以看到,<codeBase>元素内嵌在<assemblyIdentity>元素中。<assemblyIdentity>元素使用name特性和publicKeyToken特性定义友好名称和对应的publicKeyToken的值。<codeBase>元素则指定需要加载的程序集的版本和位置(通过href属性)。现在,如果只把GAC中的CarLibrary.dll的2.0.0.0版本删除,则客户端程序仍然可以正常运行,因为CLR在C:\MyAsms下能够找到被请求的程序集。
但是如果把MyAsms目录删除,则客户程序将会运行失败。这是因为<codeBase>元素的设置优先于GAC。
注解 如果在开发机器上随意放置程序集,则等同于为自己重新创建了一个系统注册表(这将会带来非常闻名的“DLL地狱”)。因为一旦移动或重命名程序集所在目录,相关应用程序将运行失败。因此,请谨慎使用<codeBase>。
<codeBase>元素能够引用位于远程网络计算机上的程序集,这是非常有用的。假设你拥有足够的权限访问http://www.IntertechTraining.com。为了把远程的*.dll下载到本地机器上的GAC下载缓存,可以对<codeBase>元素做如下修改:
<codeBase version="2.0.0.0"
href="http://www.IntertechTraining.com/Assemblies/CarLibrary.dll" />
源代码 CodeBaseClient应用程序的源代码位于Chapter 11子目录下。






