一个应用程序的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. C语言学习笔记--内存分区

    1. 程序中的栈 1.1 栈的简介 (1)栈中现代计算机程序里最为重要的概念之一 (2)栈在程序中用于维护函数调用上下文 (3)函数中的参数和局部变量存储在栈上 (4)栈保存了一个函数调用所需的维护信 ...

  2. C# WinForm中如何让当前应用程序只允许启动一个实例

    我们在WinForm开发中,很多情况下是需要只允许让用户运行一个实例,那么代码其实很简单.只需要修改Program.cs文件,代码如下 static class Program { /// <s ...

  3. AudioTrack

    AudioTrack 在Java应用中,管理和播放一个单一的语音资源 The AudioTrack class manages and plays a single audio resource fo ...

  4. 卸载phonegap

    npm uninstall cordova  -gnpm uninstall phonegap -g

  5. [poj1509]Glass Beads(最小表示法)

    题目大意:求循环同构的字符串的最小字典序. 解题关键:最小表示法模板题. #include<cstdio> #include<cstring> #include<algo ...

  6. xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at:

    今天更新了一下mac系统,然后发现  idea的svn插件不能用了,有的报 有的报  is not under version 经查找需要做如下处理,打开终端,安装xcode: xcode-selec ...

  7. meteor 命令文件shell 解析

    #!/bin/bash # This is the script that we install somewhere in your $PATH (as "meteor")# wh ...

  8. [译]Javascript中的数列

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. 在类中使用Response.Redirect()方法

    问题来自:"我在app_code 定义了user.cs类:其中作了跳转:Httpcontect.Current.Response.Redirect("/c/index.aspx&q ...

  10. Linux_Shell_ Map 的使用和遍历

    定义初始化map declare -A map=([") 输出所有key echo ${map[@]} 输出key对应的值 "]} 遍历map for key in ${!map[ ...