一个应用程序的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. struts2学习笔记(2)action多个方法的动态调用

    ①在struts.xml中的action添加method <action name="addhelloworld" method="add" class= ...

  2. MySQL存储引擎 -- MyISAM 与 InnoDB 实现

    一.MyISAM索引实现MyISAM引擎使用B树作为索引结构,叶节点的data域存放的是数据记录的地址. MyISAM主键索引这里设表一共有三列,假设我们以Col1为主键,Col2为辅助索引.则下图是 ...

  3. Android中SQLite查询date类型字段出现有返回但是为错误值的情况

    出现该情况的原因是因为查询精度与数据库中存储精度不相同造成的,例如,查询精度为 YYYY-MM-DD 但是存储精度为 YYYY-MM-DD HH:MM:SS,就会出现该错误. 更改查询精度为YYYY- ...

  4. curl的特殊使用

    1.php可以通过shell_exec()和其他系统函数使用curl,也可用PHP带的libcurl库. $curl = curl_init("wwww.baidu.com"); ...

  5. 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)

    虽然本书中假设你要建索引的内容都是有着良好结构的,比如数据库表,XML文件,CSV,但在现实中我们要保存很混乱的数据,或是二进制文件,如PDF,Microsoft Office,甚至是图片和音乐文件. ...

  6. WINFORM 开发模式,窗体回到默认样式方法。

    软件分为3类   客户端  网站应用  app WINFORM 主要用来只做客户端应用程序.C/S 客户端程序很重要的特点:可以操作用户电脑上的文件,执行在客户端上,电脑的配置越高执行就越流畅. 在p ...

  7. Linux网络服务管理命令

    netstat命令 示例:查看指定的服务是否开启netstat | grep ssh | grep -v grep 网络下载器————wget wget是一个Linux环境下用于从WWW上提取文件的工 ...

  8. JVM-jvm学习大纲(0)

    1.详细jvm内存模型 2.讲讲什么情况下回出现内存溢出,内存泄漏? 3.说说Java线程栈 4.JVM 年轻代到年老代的晋升过程的判断条件是什么呢? 5.JVM 出现 fullGC 很频繁,怎么去线 ...

  9. jmeter beanShell 修改http请求参数

    转自http://www.tuicool.com/articles/rEri63   http://powertech.iteye.com/blog/2174521 主题 HTTPJMeter 在使用 ...

  10. sql 试图索引

    视图是对数据(一种元数据类型)的一种描述.当创建了一个典型视图时,通过封装一个 SELECT 语句(定义一个结果集来表示为虚拟表)来定义元数据.当在另一个查询的 FROM 子句中引用视图时,将从系统目 ...