一个应用程序的XML配置文件示例:

<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="AuxFiles;bin\subdir" />
<dependentAssembly>
<assemblyIdentity name="JeffTypes" publicKeyToken="32ab4ba45e0a69a1" culture="neutral" />
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
<codeBase version="2.0.0.0" href="http://www.Wintellect.com/JeffTypes.dll" />
</dependentAssembly> <dependentAssembly>
<assemblyIdentity name="TypeLib" publicKeyToken="1f2e74e897abbcfe" culture="neutral" />
<bindingRedirect oldVerison="3.0.0.0-3.5.0.0" newVersion="4.0.0.0" />
<publisherPolicy apply="no" />
</dependentAssembly>
</asssemblyBinding>
</runtime>
</configuration>

这个XML文件为CLR提供了丰富的信息。具体如下所示。

  • probing元素 查找一个弱命名程序集时,检查应用程序基目录的AuxFiles和bin\subdir子目录。对于强命名程序集,CLR会检查GAC或者由codeBase元素指定的URL。只有在未指定codeBase元素的前提下,CLR才会在应用程序的私有路径中检查强命名程序集。
  • 第一个dependentAssembly,assemblyIdentity和bindingRedirect元素 查找由控制着公钥标记 32ab4ba45e0a69a1 的那个组织发布的、语言文化为中性的JeffTypes程序集的1.0.0.0版本时,改为定位同一个程序集的2.0.0.0版本。
  • codeBase 元素 查找由控制着公钥标记 32ab4ba45e0a69a1 的组织发布的、语言文化为中性的JeffTypes程序集的2.0.0.0版本时,尝试在以下的URL处发现它:www.Wintellect.com/JeffTypes.dll 需要指出codeBase元素也能用于弱命名程序集。在这种情况下,程序集的版本号会被忽略,而且根本就不应该在XMLcodeBase元素中写这个版本号。此外,codeBase所定义的URL必须引用应用程序基目录下的一个子目录。
  • 第二个 dependentAssembly,assemblyIdentity和bindingRedirect元素 查找由控制着公钥标志 1f2e74e897abbcfe 的那个组织发布的、语言文化为中性的TypeLib程序集的3.0.0.0到3.5.0.0版本时(包括3.0.0.0和3.5.0.0在内),改为定位同一个程序集的4.0.0.0版本。
  • publisherPolicy 元素 如果生成TypeLib程序集的组织部署了一个发布者策略文件,CLR应该忽略该文件。

编译方法时,CLR会确定它引用了哪些类型和成员。根据这些信息,“运行时”检查发出引用的那个程序集的AssemblyRef表,判断该程序集在生成时引用了哪些程序集。然后,CLR在应用程序配置文件中检查程序集/版本,并进行设定的任何版本号重定向操作。接着,CLR查找新的、重定向的程序集/版本。

如果publisherPolicy 元素的 apply attribute 设为 yes,或者该元素被省略,CLR 会在GAC 中检查新的程序集/版本,并进行程序集发布者认为有必要进行的任何版本号重定向操作。随后,CLR会查找新的、重定向的程序集/版本。(关于发布者策略有抓们的笔记记录)最后,CLR在机器的Machine.config文件中检查新的程序集/版本,并进行设定的任何版本号重定向操作。

到此为止,CLR已经知道了它应该加载的程序集的版本,并尝试从GAC中加载该程序集。如果程序集不在GAC中,而且没有codeBase元素,CLR会探测程序集。如果执行最后一次重定向操作的配置文件同时包含一个codeBase元素,CLR会尝试从codeBase元素指定的URL处加载程序集。

利用这些配置文件,管理员可以实际地控制CLR加载的程序集。如果一个应用程序出现bug,管理员可以和有问题的程序集的发布者取得联系。发布者可以将一个新的程序集发送给管理员,让管理员安装。CLR默认不会加载这个新的程序集,因为已经生成的程序集没有引用的新版本。不过,管理员可以修改应用程序的XML配置文件,指示CLR加载新的程序集。

如果管理员希望机器上的所有应用程序都使用新的程序集,可以修改机器的Machine.config文件(而不是修改应用程序的配置文件)。每当一个应用程序引用就得程序集时,CLR都会自动加载新的程序集。

如果发现新的程序集没有修复原来bug,管理员可以从配置文件中删除bindingRedirect设置,应用程序会恢复如初。

重点概括:系统允许使用和元数据所记录的不完全匹配的一个程序集版本。

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)的更多相关文章

  1. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_发布者策略控制

    在 读经典——<CLR via C#>(Jeffrey Richter著) 笔记_高级管理控制(配置)中,是由程序集的发布者将程序集的一个新版本发送给管理员,后者安装程序集,并手动编辑应用 ...

  2. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_通过ILDasm.exe查看编译器如何将类型及其成员编译成元数据

    [实例代码] using System; public sealed class SomeType //-------------1 { //嵌套类 private class SomeNestedT ...

  3. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(二)

    [基元类型推荐] 推荐直接使用 FCL 类型. [理由] 编码时不至于困惑string与String的使用.由于C#的stirng(一个关键字)直接映射到System.String(一个 FCL 类型 ...

  4. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(一)

    [概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符 ...

  5. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用

    public sealed class Program{ public static void Main() { System.Console.WriteLine("Hi"); } ...

  6. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_方法执行

    [前言] 方法执行前,CLR 会检测方法内代码引用的所有类型.同时 CLR 会分配一个内部数据结构,用来管理对所有引用的类型的访问. 首次执行方法时,托管程序集会把 IL 转换成本地 CPU 指令,并 ...

  7. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_元数据

    1.元数据简介 全称:metadata 属性:数据表集合 产地:面向 CLR 的编译器在托管模块中生成 2.元数据内部结构及与托管模块的关系 [概述] 托管模块中包含着元数据,元数据是由一组数据表组成 ...

  8. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_友元程序集

    [应用场景] 程序集A访问程序集B定义的Internal访问类型的类的成员. [使用方式] 在构建程序集B的时候,引入System.Runtime.CompilerServices,以此来添加Inte ...

  9. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_类型的各种成员

    [Class中,可能包含的成员] 常量, 字段, 实例构造器, 类型构造器, 方法, 操作符重载, 转换操作符, 属性, 事件, 类型(Class)

随机推荐

  1. php中用大括号把?>和<?php框起来的作用

    <?php function my_function() { ?> My function was called <!--就是这里,为什么前面要用?>和< ?php 把M ...

  2. js实现无刷新上传

    在新增数据项的时候,用ajax实现无刷新提交,但上传文件的时候,由于数据类型原因,不能将页面的<asp:FileUpload>中以字符串值的方式传到js里调用.我一共找到了两个方法予以解决 ...

  3. 安装visual_Paradigm,时序图的应用

    此安装包已经上传到sunny的百度网盘. 删除,即,右击别的地方,然后,选择delete即可. 拖箭头,拖到某个实体上,再松开,会自动连线. 很好的一款画图工具.

  4. mono-3.0.2安装指南

     install-mono.sh.zip   mono-3.0.2安装指南.pdf   mod_mono.diff.zip mono-3.0.2安装指南 一见 2012/12/27 目录 1. 前言 ...

  5. .net中值类型、引用类型理解的c#代码示例

    下面是以前在公司的时候给别人讲解值类型.引用类型时创建的c#代码示例,从实际使用时的角度出发,对于初学者还是很有帮助的.这里并没有深入讲解值类型包含引用类型成员时(如struct)在内存中的存放情况等 ...

  6. 完全离线安装VSCode插件--Eslint

    最近折腾了一番,总算把Eslint插件在离线的情况下安装好了.之前查了挺多,但是很多方法还是在没有完全离线的情况下进行的.之所以想完全离线安装,主要是因为我们工作的地方是禁止访问外网的,所以像直接执行 ...

  7. jQuery的Validate插件

    http://www.runoob.com/jquery/jquery-plugin-validate.html 项目中的:: $(function () { $('#createDepartment ...

  8. 浅聊本人学习React的历程——第一篇生命周期篇

    作为一个前端小白,在踏入前端程序猿行业的第三年接触了React,一直对于框架有种恐惧感,可能是对陌生事物的恐惧心里吧,导致自己一直在使用原生JS和JQ作为开发首选,但是在接触了React之后,发现了其 ...

  9. c++内联 inline

    内联声明只是建议 ,不一定就会内联. http://www.voidcn.com/blog/u011327981/article/p-5006835.html

  10. iOS开发图片与颜色处理工具

    1.根据颜色生成一张图片 /** 根据颜色生成一张图片 @param color 颜色进制 UIColor类型 @return 一张UIImage图片 */ + (UIImage *)createIm ...