读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)中,是由程序集的发布者将程序集的一个新版本发送给管理员,后者安装程序集,并手动编辑应用程序后机器的 XML 配置文件。通常,发布者希望在修复了程序集的一个 bug 后,能采取一种容易的方式将新的程序集打包并分发给所有的用户。但是,发布者还需要一种方式告诉每个用户的 CLR 使用新的程序集版本,而不要继续使用旧版本。当然,可以指示每个用户手动修改应用程序或机器的 XML 配置文件,但这相当不方便,而且容易出错。因此,发布者需要使用一种方式来创建策略信息,当新程序集安装到用户机器上时,就会安装这些策略信息。本节将描述程序集的发布者如何创建这种策略信息。

假定你是一个程序集的发布者,而且刚刚创建了程序集的一个新版本,并修复了几个 bug。打包要发送给所有用户的新程序集时,应同时创建一个 XML 配置文件。 这个配置文件和以前讨论过的配置文件差不多。下面是一个用户 JeffTypes.dll 程序集的示例文件(名未JeffTypes.config):

 <configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<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>
</assemblyBinding>
</runtime>
</configuration>

当然,发布者只能为自己创建的程序集设置策略。除此之外,前面展示的是在发布者策略配置文件中唯一能使用的元素:例如:probing 或 publisherPolicy 元素是不能使用的。这个配置文件指示 CLR 一旦发现对 JeffTypes 程序集的 1.0.0.0 版本的引用,就自动加载 2.0.0.0 版本。现在,作为发布者,可创建包含这个发布者策略配置文件的一个程序集。为了创建发布者策略程序集,要像下面这样运行 AL.exe:

AL.exe /out:Policy...JeffTypes.dll
/version:...
/keyfile:MyCompany.snk
/linkresource:JeffTypes.config

下面是对 AL.exe命令行开关的解释:

  • /out 这个开关指示 AL.exe 创建一个新的 PE 文件,本例就是 Policy.1.0.JeffTypes.dll,其中除了一个清单之外什么都没有。程序集的名称很重要。名称的第一个部分(Policy)告诉 CLR 该程序集包含发布者策略信息。第二部分和第三部分(1.0)告诉 CLR 这个发布者策略程序集适用于 major 和 minor 版本为 1.0 的任何版本的JeffTypes 程序集。发布者策略只能和程序集的major 和 minor 版本号关联:不能喝 build 或 revision 号关联。名称的第四部分(JeffTypes)指出与这个发布者策略对应的程序集的名称。名称的第五部分(dll)是现在要生成的发布者策略程序集文件的扩展名。
  • /version 这个开关标识发布者策略程序集的版本:这个版本号与 JeffTypes 程序集本身没有任何关系。看得出来,发布者策略程序集本身也有一套版本机制。例如,今天,发布者可以创建一个发布者策略,将 JeffTypes 的 1.0.0.0 重定向到版本 2.5.0.0。CLR根据/version 开关指定的版本号来选择最新版本的发布者策略程序集。
  • /keyfile 这个开关指示 AL.exe 使用发布者的 “公钥/私钥对” 对发布者策略程序集进行签名。这个密钥对还必须匹配于所有版本的 JeffTypes 程序集的密钥对。毕竟,只有这样, CLR 才知道 JeffTypes 程序集和发布者策略文件是由同一个发布者创建的。
  • /linkresource 这个开关告诉AL.exe 将 XML配置文件作为一个资源链接(而非嵌入)到程序集。最后的程序集是由两个文件构成的(现在要生成的 Policy.1.0.JeffTypes.dll 和 刚才已经创建好的 XML 配置文件 JeffTypes.config),两个文件都必须随同新版本的JeffTypes 程序集打包并部署到用户机器上。顺便说一句,不能使用 AL.exe 的 /embedresource 开关将 XML  配置文件嵌入程序集文件,从而获取一个单文件的程序集。这个因为 CLR 要求 XML 文件包含在它自己的一个单独的文件中。

一旦生成这个发布者策略程序集,就可随同新的 JeffTypes.dll 程序集文件打包并部署到用户机器上。发布者策略程序集必须安装到GAC中。虽然 JeffTypes 程序集也能安装到 GAC 中,但并不是必须的——它可以部署到应用程序的基目录,后者部署到由一个 codeBase URL标识的其他目录中。

关于发布者策略,最后还要注意一点。发布者推出一个发布者策略程序集时,因为某种原因,新的程序集引入的 Bug 可能比它修复的 Bug 还要多。发生这种情况后,管理员可以指示 CLR 忽略发布者策略程序集。为此,管理员要编辑应用程序的配置文件,并添加以下 publisherPolicy 元素:

<publisherPolicy apply="no" />

这个元素可以作为应用程序配置文件的<assemblyBinding> 元素的一个子元素使用,使其应用于所有程序集;也可作为应用程序集配置文件的<dependentAssembly> 元素的一个子元素使用,使其应用于一个特定的程序集。这样一来,CLR 处理应用程序的配置文件时,就知道自己不应再 GAC 中检查发布者策略程序集。所以,CLR会继续使用旧版本的程序集。但要注意,CLR 仍会检查并应用 Machine.config 文件中指定的任何策略。

读经典——《CLR via C#》(Jeffrey Richter著) 笔记_发布者策略控制的更多相关文章

  1. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_高级管理控制(配置)

    一个应用程序的XML配置文件示例: <?xml version="1.0"?> <configuration> <runtime> <as ...

  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++primer-p100.用迭代器进行二分法搜索

    #include <vector> #include <iostream> using namespace std; int main() { vector<int> ...

  2. Android Notification通知

    /** * 在状态栏显示通知 */ private void showNotification(){ // 创建一个NotificationManager的引用 NotificationManager ...

  3. Codeforces 1136F Cooperative Game (神仙题)

    这种题就是难者不会,会者不难. 博客讲的很详细了 代码: #include <bits/stdc++.h> using namespace std; string s; int read( ...

  4. c#基础;初步学习循环语句

    循环语句就是 在满足循环条件的情况下会有顺序的执行循环体 循环语句:for   :    while    :     foreach:三种. 循环语句 必须具备四要素:初始条件.循环条件.循环体.状 ...

  5. C++ 面向对象: I/O对象的应用

    1. 补充完整从text.txt文件读取数据后,再写入in.txt文件.2. 完成从text.txt文件读取数据后,进行排序,再写入in.txt文件.数据量自行设定.3. 请解决在主程序文件中加载多个 ...

  6. Luogu 4103 [HEOI2014]大工程

    BZOJ 3611 明明在BZOJ上是$6s$的时限,怎么到Luogu上就变成$4s$了…… 按照套路建出虚树,点之间的距离可以变成边权表示在虚树上,然后考虑如何树形$dp$. 最大值和最小值应当比较 ...

  7. python3-深浅复制

    # Auther: Aaron Fan names = ["aaron", "alex", "james", "meihengfa ...

  8. Umbraco Form 中需要为一个Form的某个field设置特别的CSS样式

    在项目开发中,我有一个需求,需要建立一个页面,这个页面上有一个form, 这个form上有一个checkbox, 就是普通的接受terms & conditions, 类似下图 这个项目中的U ...

  9. 数据结构 lucky_ming幸运的小明

    问题描述 在快速排序过程中, 每次会找一个划分值, 将小于划分值的放到其左边, 大于划分值的放右边, 然后再依次递归左右两边, 对子序列进行同样的操作, 直到子序列为空则停止操作.最后就得到了有序的序 ...

  10. 抽象类(abstract)【转】

    抽象类(abstract) abstract修饰符可以和类.方法.属性.索引器及事件一起使用.在类声明中使用abstract修饰符以指示某个类只能是其它类的基类.标记为抽象或包含在抽象类中的成员必须通 ...