如何配置程序集的版本策略
本文节选自《.NET程序员面试指南》一书

在实际工作中,版本策略被使用得比较多,本节将借助分析这个面试题来简要介绍程序集的版本策略和配置方法。
  所涉及到的知识点    
•    版本策略的基本原理
•    程序集版本策略的配置
  分析问题
当一个程序集通过名字、版本、文化和公钥进行加载时,CLR允许程序员指定该程序集的哪些版本可以代替目前版本进行加载。这些都是通过版本策略来实现的。所谓的版本策略,就是一个程序集版本的重定向,把加载当前这个版本定向到加载可替代的版本。版本策略可以在以下三个级别上进行配置:
•    应用程序策略
•    发行者策略
•    计算机策略
这三个级别的版本策略都可以通过XML文件来进行配置。现在笔者来分别介绍。
1.应用程序策略
应用程序策略可以在应用程序配置文件中进行配置,应用程序配置文件位于应用程序目录下。对于.EXE应用程序,其配置文件由exe文件名加上.config后缀名构成,例如一个test.exe的应用程序,其配置文件就是test.exe.config。而对于任何一个Web应用程序来说,其配置文件的文件名都是web.config。
版本策略都记录在配置文件的assemblyBinding节点下。代码2-7是一个应用程序的配置文件例子,这里只选取了本节所关心的版本策略部分内容。
代码2-7  VersionStrategy:Web.Config
<?xml version="1.0"?>
<configuration>
  <runtime>
    <assemblyBinding>
      <!--对这个程序集进行版本重定向-->
      <dependentAssembly>
        <assemblyIdentity
          name="NET.MST.Second.Compile"
          publicKeyToken="60c29e5f0af3e9bb">
        </assemblyIdentity>
      </dependentAssembly>
      <!--重定向的策略-->
      <bindingRedirect oldversion="0.0.0.0-12.2.2.2"
                       newversion="12.3.0.0">
      </bindingRedirect>
    </assemblyBinding>
  </runtime>
</configuration>
在代码2-7这个配置文件中,指定了NET.MST.Second.Compile,60c29e5f0af3e9bb这个组件的版本策略,这个策略将0.0.0.0到12.2.2.2之间的所有版本重定向到12.3.0.0版本上。
2.发行者策略
发行者策略是针对那些被放入全局程序集缓存(GAC)中的程序集,发行者策略以一个和代码2-6同样格式的配置文件形式绑定到程序集上,被一同放入GAC中。发行者策略配置文件的文件名非常古怪,它是这样的一个字符串:主版本号.次版本号.程序集名.dll。正因为如此,一个程序集的每个主版本/次版本号只能有一个发行者策略。
3.计算机策略
同样地,计算机策略同样由一个配置文件表示,它的格式也和代码2-7基本类似。计算机级版本策略配置文件的文件名为:machine.config,它被存储在%SystemRoot%/ Microsoft.NET/ Framework/v****/CONFIG/目录下。
读到这里,读者可能会有这样的疑问:版本策略可以在3个级别进行配置,那这些策略是如何协作的呢?按照.NET的机制,3个级别的版本策略将会按照顺序依次执行,而上一级别的执行结果将会被作为下一级别的执行输入,图2.6展示了这个执行过程。
如图2.6所示,3个级别版本策略被依照:应用程序、发行者、计算机的顺序依次执行。而其中,发行者策略是可选的,在以下两种情况下发行者策略将不会被执行。
•    程序集没有被加入到GAC中
•    应用程序策略制定忽略发行者策略
在第一种情况下,根本就不存在发行者策略配置文件,当然CLR也就不会执行发行者策略。而第二种情况,是程序员在应用程序策略中指定忽略发行者策略,具体做法是在应用程序配置文件中加入publisherPolicy节点,并且把apply属性值设置为no。代码2-8就是在代码2-7的基础上,指定了忽略发行者策略。
代码2-8  VersionStrategy-NoPolisherPolicy:Web.Config
<?xml version="1.0"?>
<configuration>
  <runtime>
    <assemblyBinding>
      <!--对这个程序集进行版本重定向-->
      <dependentAssembly>
        <assemblyIdentity
          name="NET.MST.Second.Compile"
          publicKeyToken="60c29e5f0af3e9bb">
        </assemblyIdentity>
      </dependentAssembly>
      <!--重定向的策略-->
      <bindingRedirect oldversion="0.0.0.0-12.2.2.2"
                       newversion="12.3.0.0">
      </bindingRedirect>
      <!--指定忽略发行者策略-->
      <publisherPolicy apply="no">
      </publisherPolicy>
    </assemblyBinding>
  </runtime>
</configuration>
  答案
CLR支持在3个级别上设定版本策略,依次是:应用程序策略、发行者策略和计算机策略。所有策略的设置都是通过修改配置文件来实现。3个级别的策略依次会被CLR执行,而上一个策略的执行结果将被作为下一个策略的输入。发行者策略仅仅针对那些放入GAC的程序集,并且可以在应用程序策略中被指定忽略。


5}J J l/m8rsm13164110
f.M T6?+~ Q13164110【书名】.NET程序员面试指南
【作者】朱毅 等 编著
【ISBN】978-7-121-07675-6
【出版社】电子工业出版社
【出版日期】2008年12月
【宣传语】
从面试的角度来梳理.NET程序员的技术功底。
以项目开发经理的眼光来审视编程知识的掌握。
【内容简介】
本 书着重针对.NET技术职位的应聘者,在.NET框架各个技术类别中,选取最常出现在.NET面试中的问题,进行分析和解答,同时解释和剖析和该问题相关 的.NET机制原理,帮助读者达到知其然更知其所以然的程度。本书几乎包揽了所有常见的面试题,从基础知识、数据库,再到比较流行的XML、测试方法和算 法,是目前市场上唯一一本面试试题集锦。
全书配合了大量的图例及代码说明,非常适合正打算参加.NET技术职位的应聘和希望梳理.NET框架下技术点的读者阅读

如何配置程序集的版本策略相关推荐

  1. 无法在 COM+ 目录中安装和配置程序集 microsoft.sqlserver.notificationservices.dll

    安装SQL Server 2005的时候,出现错误,错误对话框的内容没有记录下来,不过Summary.txt(Summary.txt 位于%ProgramFiles%\Program Files\Mi ...

  2. PCI 32,PCI 64和PCI-X,PCI-E图解差别

    转贴:http://blog.csdn.net/wangjunhe/article/details/6710735 转 图解 pci pci-x pci-e PCI Express:串行总线 PCI ...

  3. (8)C#导入库编译出错:请考虑使用 app.config 将程序集“log4net, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a”

    当引用SuperSocket类库时,导致编译出下面的提示: 请考虑使用 app.config 将程序集"log4net, Culture=neutral, PublicKeyToken=66 ...

  4. nhibernate 配置mysql_利用NHibernate与MySQL数据库交互

    本文章使用Visual Studio作为开发工具,并建立在已经安装MySQL数据库的前提. NHibernate是一个面向.NET环境的对象/关系数据库映射工具.官网:http://nhibernat ...

  5. 【C/C++】VS的cl命令 | 配置环境变量 | 使用命令行编译C/C++程序

    文章目录 一.前言 二.准备 三.配置环境变量 1. 逐步配置 2. 一步到位 四.语法 更多文章 一.前言 作为一个C++ (C语言) 程序员,VS可谓是编写代码的神器(天下第一IDE!).但是它的 ...

  6. Spring.net使用说明

    使用方法: 1.在配置文件设置Spring.net 节点  在配置节中,声明Spring.net,配置 context,objects 标签,来源(type) <!--配置节:主要用来 配置 a ...

  7. ASP.NET虚拟主机的重大安全隐患

    作者:秦海鹏  来自: yesky 说明:本文中所有程序均在Windows 2000 Server中文版 + SP2上编译运行无误 开发环境:.Net 框架1.0 Version 1.0.3705 一 ...

  8. 一起谈.NET技术,Visual Studio 2010 中的代码约定设置

    软件约定称为代码约定,通过这一约定可以表示代码正常工作所需的正式条件. 如果方法未按预期收到数据或生成的数据不符合预期的后置条件,代码约定将导致代码引发异常. 有关前置条件和后置条件的概述,您可能需要 ...

  9. C#.Net命名空间大纲

      .NET Framework 类库提供下列命名空间: ▲Microsoft.CSharp 包含支持用 C# 语言进行编译和代码生成的类. ▲Microsoft.JScript 包含支持用 JScr ...

  10. 微软官方的.NET Framework API 参考网址

    微软官方的.NET Framework API 参考网址,值得收藏和查阅~~~ https://docs.microsoft.com/zh-cn/dotnet/api/?view=netframewo ...

最新文章

  1. (转)小小的研究了一下linux下的”注册表“ gconf-editor
  2. 一些实用的 Javascript 代码
  3. 2.1.2 数据通信基础知识
  4. 淘宝搜索中基于embedding的召回
  5. python xlwt单元格合并_Python xlwt写入单元格并合并单元格操作问题,pythonxlwt,我想展示成这样:----...
  6. SAP Pricing的access sequence是如何在循环被处理的
  7. Python+Opencv根据颜色进行目标检测
  8. C字符数组赋值(转)
  9. python全局变量global线程安全_对python多线程与global变量详解
  10. Python机器学习:贝叶斯文本分类器
  11. 引用数据类型的一些知识
  12. upc 兔子与兔子(字符串Hash)
  13. 用c语言求定积分实验报告,C语言用六种方法求定积分.doc
  14. 小米pro蓝牙驱动linux,【小米笔记本蓝牙驱动下载】小米笔记本蓝牙驱动程序官方下载 V20.11 通用版-七喜软件园...
  15. 230个形容人性格的英语词汇
  16. 解决wordcloud导出图片不清楚
  17. mongodb java 内嵌文档_MongoDB 内嵌文档
  18. 【html标签复习】
  19. Redis的哨兵机制你知道多少撒
  20. 【快速入门大数据】Hadoop项目实战-用户行为日志

热门文章

  1. ZipArchive是一个开源的zip开发包工具。
  2. 关于JS中的严格模式
  3. Codeforces Round #365 Div.2
  4. BitmapFactory.decodeResource(res, id); 第一个参数跟第二个参数有什么关系?
  5. 登录phpmyadmin提示: #1045 无法登录 MySQL 服务器
  6. (宏)Word修改段落行距为固定值24磅
  7. 第一节补充: 按键操作(CubeMX加HAL库学STM32系列)
  8. 走进JavaScript
  9. easyui-treegrid的案例
  10. Android ListView显示底部的分割线