程序集定位的配置解析
CLR的定位和加载程序集运行的过程是由CLR的程序集加载器来完成的,这个程序集的加载器通常也称为fusion。并且这个程序集的部署模型是是智能的而且可以配置的。其智能性体现在当程序集在某个文件夹下没有找到时,CLR会使用某种算法,如试探性地在子文件夹中搜索同名的程序集。CLR的智能性还体现在,如果发现一个程序原来可以正常工作现在而现在因为找不到某个程序集而出错,它可以轻易地将错误的更改回滚。CLR的可配置性体现在管理员可随时移动程序集的位置而始终确保CLR仍能定位它们。这些可配置性体现在:
1、 可以将正在使用的某个版本的程序集重新定向到另一个版本;
2、 在某个特殊的文件夹或从一个URL(Unique Resource Locator 统一资源定位符)加载程序集;
3、 是否需要考虑程序集可能的发布者策略。
这些配置信息包含在配置文件的一个<assemblyBinding>的元素中,其下的子项有:
<probing>指定探测机制需要搜索的一个或多个文件夹;
<publiserPolicy>决定在定位程序集是还有需要考虑程序集可能的发行者策略;
<codeBase>定位需要下载的程序的URL;
<bindingRedirect>重定向新的版本的程序集。
例如:Foo.config文件 |
<?xml version=”1.0” encoding=”utf-8”?> <configuration> <runtime> <assemblyBinding xmlns=”urn:schemas-microsoft-com:asm.v1”> <probing privatePath=”Path1;Path2/bin”/> <dependentAssembly> <assemblyIdentity name=”Foo” culture=”en-US” publicKeyToken=”C64B742BD612D74A”/> <publisherPolicy apply=”no”/> <bindingRedirect oldVersion=”1.0.0.0” newVersion=”2.0.0.0”/> </dependentAssembly> </assemblyBinding> </runtime> </configuration> |
为了使用这个配置文件,我们需要创建一个发布者策略程序集,这个程序集由两个模块组成:一个模块是一个以上面的.config为后缀名的XML配置文件;另一个模块则是包含相关的清单。这个模块需要使用al.exe来完成,具体如:
>al.exe /out:policy.1.0.Foo.dll /version:1.0.0.0
/keyfile:MyKeys.snk /linkresource:Foo.config
其中:/out:选项指示清单的模块的名称,由三部分组成:policy指明使用一个发布者策略(不可变);1.0指明请求的Foo.dll的版本号(只有主版本号和次版本号);Foo指明应用于Foo.dll的程序集。
/version:指明发布者策略程序集自己的版本号。
/keyfile:指明签名的密钥文件(与Foo.dll相同)。
/linksource:指定XML配置文件。
因此发布者策略程序集本身包括两个文件:XML配置文件和al.exe生成的policy.*.*.*.dll。