学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (3)

类别:.NET开发 点击:0 评论:0 推荐:

学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (3)
2005-1-3

3.6 延迟签名
        1、在开发和测试程序集时,允许访问安全的私有密钥可能会导致私钥泄密,因而,.NET框架支持一种称作延迟签名(delayed signing)的技术,有时也叫局部签名(partial signing)。
延迟签名允许我们只使用公司的公有密钥就可以生成程序集:
        a、程序集引用我们的程序集,使用公有密钥允许它们将正确的公有密钥嵌入到AssemblyRef元数据条目中;
        b、公有密钥生成的程序集还允许被放在GAC的内部结构中;
        c、但用公有密钥生成的程序集因为没有经过散列转换也没有在文件中嵌入数字签名,将失去篡改保护功能。

        2、实现延迟签名:
        a、将公司的公有密钥存放在一个文件中,然后将该文件名传递给程序集生成工具(3.2中的2有详细讲述);
        b、将下面的两个特性加到源代码中告诉生成工具对程序集进行延迟签名:
[assembly:AssemblyKeyFile(“MyCompanyPublicKey.keys”)]
[assembly:AssemblyDelySign(true)]
如果使用AL.exe工具,还可以在命令行中指定 /keyf[ile]和 /delay[sign]开关来实现;
        c、将程序集安装到GAC,必须通过给 SN.exe 工具指定 -Vr 命令行开关阻止系统对程序集进行完整性验证。这样还可以使CLR在运行时加载程序集的时候,跳过对其内任何文件的散列值的检查:
SN.exe -Vr MyAssembly.dll;
        d、完成开发和测试后,打包和部署程序集时需要用SN.exe 的 -r 命令行开关使用私有密钥对程序集进行签名,用SN.exe的 -Vu 或 -Vx 命令行开关恢复对程序集的验证过程:
SN -Vu MyAssembly.dll

        3、一些组织将它们的密钥对保存在一个硬件设备中,一些加密服务商(CSP)为抽象这些密钥的位置提供了某些“容器”。
        如果我们的公钥/私钥保存在一个CSP容器里,则应该使用 System.Reflection.AssemblyKeyNameAttribute 特性或者 AL.exe 的 /keyn[ame] 命令行开关;而当使用SN.exe将私有密钥添加到延迟签名的程序集商时,则用 -Rc 命令行开关代替 -R 。

        3.7 强命名程序集的私有部署
        不一定都得装到GAC中,实际上,如果只有少数程序共享到你的程序集时,你的强命名程序集也可以进行私有部署。当其他程序集引用该程序集时得为其安装一个XML配置文件(2.7中1例子有说明)。

        3.8 并存执行
        CLR能够将名称相同但路径不同的多个文件加载到同一个地址空间,这在.NET框架中称为并存(side-by-side)执行,它是解决Windows中“DLL hell”问题的一项关键技术。DLL的并存执行能力允许我们创建的新版本程序集不必维持向后兼容。
        (都是因为强命名的程序集用文件名(无扩展名)、版本号、语言文化标识及一个公有密钥标记标识,可以将同一名称的程序集同本公司其他版本程序集、其他公司的程序集区分开来。)

        3.9 CLR如何解析类型引用
        例子:
        public class App {
          static public void Mian(System.String[] args) {
             System.Console.WriteLine(“Hi”)’
        }
        }
        该代码被编译生成一个程序集App.exe。当我们运行该应用程序时,CLR将加载并初始化它。然后CLR会读取该程序集的CLR表头来寻找标识应用程序入口方法(Main)的MethodDefToken。根据MethodDef元数据表,CLR会定位到文件中该方法的IL代码所处的偏移,然后将其以JIT的方法编译为本地代码,同时完成代码的类型安全验证过程,最后执行编译后的本地代码。
        当CLR以JIT的方式编译该段代码时,它会检测到所有应用到的类型和成员,并加载定义他们的程序集。
上面的例子里,IL代码中有一个引用为System.Console.WriteLine。IL 有一call 指令标引用的元数据标记标识了MemberRef 元数据中的一个条目。a、CLR会查找MemberRef,并发现其中的一个字段指向了TypeRef 表中的一个条目(即 System.Console 类型)。 b、从TypeRef条目中,CLR会被导向到一个AssemblyRef 条目上:“MSCorLib,Version=1.0.3300.0,Culture=”neutral”,PublicKeyToken=b77a5c561934e089”。到这里CLR将知道自己需要哪个程序集。

        3.10 高级管理控制(配置)
        2.7中提到如何配置CLR搜索和绑定程序集的方式,仅仅讨论了定位元素privatePath属性,本节介绍其他一些XML配置文件元素。

        1、几个配置元素:(书中的例子太长,有兴趣的朋友翻翻书吧)
        probing:指示CLR在应用程序在其指定的目录中查找弱命名程序集;
        dependentAssembly、assemblyIdentity 和 bindingRedirect:指示CLR在定位原来指定的程序集时重新转定位另一个指定的程序集,可以实行版本号重定向;
        codeBase:指示CLR指示在指定的目录或URL地址查找程序集,它也可以被用于弱程序集(这种情况下,CLR忽略程序集版本号及XML codeBase元素中指定的版本号);
        publisherPolicy:指示CLR是否忽略部署的发布者策略文件。

        2、CLR确定程序集引用的程序集:
        a、查找AssemblyRef表知道要引用的程序集;
        b、在应用程序的配置文件中查找程序集,同时会应用其中指定的版本号重定向策略;如果publisherPlocy元素的apply属性被设置为yes或者忽略该元素CLR将会检查GAC并应用任何程序集发布者认为必要的版本号重定向策略(发布者策略);
        c、接着CLR会到机器内的Machine.config文件中查找程序集,并应用任何其中指定的版本号重定向策略;
        d、最后CLR知道它应该加载哪个版本的程序集,并首先试图从GAC中加载,如果程序集不在GAC中,并没有指定codeBase元素,CLR会按照第2章所说的规则来定位程序集。
        利用这些配置文件,管理员可以完全控制CLR应该加载哪些程序集。如果希望机器内所有程序集采用最新的程序集,则应该修改机器中的Machine.config文件。
        2.7的5提到.NET中提供了方便的GUI配置工具。

 3.10.1 发布者策略控制
        当发布者修复了原版本程序集中的bug时,希望用户用新版本代替新版本,如果让每个用户自己通过修改他的应用程序集或机器上的XML配置文件是非常不方便的。发布者策略控制就可以使得在安装新的程序集时,能够创建可以安装到用户机器上的“策略信息”。
发布者策略程序集必须被安装到GAC中。

3.11 修复错误的应用程序
        1、当控制台或者Windows窗体应用程序正在一个用户帐号下运行时,CLR会保持一个应用程序实体加载的程序集的记录,加载信息被累积在内存中,并在程序结束时被写入以下磁盘路径中: C:\Documents and Settings\UserName\Local Settings\Application Data\ApplicationHistory
        目录中每个文件标识着一个特殊的应用程序,文件名类似:App.exe.c4bc1771.ini。其中的16进制数是一个标识文件路径的散列值,它用来区分不同子目录下的同名文件。

        2、当一个应用程序运行时,CLR会维持一个应用程序所加载的程序集的集合“快照”。当应用程序结束时,该信息将和应用程序相关联的.ini文件内容比较:
        a、如果应用程序但前加载的程序集集合和先前加载的程序集集合相同,也就是.ini文件中的信息和内存中的信息相同,内存里的信息将被丢弃;
        b、如果内存中的信息不同于.ini文件中的信息,CLR会将内存中的信息追加到.ini文件中。
        c、默认情况下,.ini文件能够存储5个快照。

        3、由于某种原因,如果我们运行的应用程序出了问题,因为CLR保持了一个应用程序使用的程序集的历史记录,我们就可以为引用程序集创建一个XML配置文件,其中的元素告诉CLR使用最近一次运行正常时加载的程序集。
        用.NET框架配置工具我们可以很容易做到这一点,运行工具――『应用程序』――『修复应用程序』,就可以进行配置。
        对应用程序XML配置文件所做的改变会被注释元素标识,注释元素包括:“.NET Appliction Restore BeginBlock”和“.NET Appliction Restore EndBlock”

    (以上是本书的第一部分,讲的东西都是.NET很基础的东西,有的地方还是很有难度的,看来要好好学一本书也不容易。希望大家讨论讨论。
      前几天天一下的冷下来,对于一直在过暖冬的我还真有点不适应,白天没空整理,夜里房里又没暖气,手僵敲不出字来,加上年底杂事多,本来早该整理完的前三章也拖到了2005年。向各位朋友说声:新年好!
      这几天一冷就躺被窝书是没看了,收获就是看了央视的《荆柯传奇》,剧情一般般其中的片尾曲倒是不错,发歌词和大伙共享:

红颜


剑煮酒无味饮一杯为谁
你为我送别你为你送别
胭脂香味能爱不能给
天有多长地有多远

你是英雄就注定无泪无悔
这笑有多危险是穿肠毒药
这泪有多么美只有你知道
这心没有你活着可笑
这一世英名我不要
只求换来红颜一笑
这一去如果还能轮回
我愿意来生作牛马
也要与你天涯相随

剑煮酒无味饮一杯为谁
你为我送别你为你送别
胭脂香味能爱不能给
天有多长地有多远
你是英雄就注定无泪无悔
这笑有多危险是穿肠毒药
这泪有多么美只有你知道
这心没有你活着可笑
这一世英名我不要
只求换来红颜一笑
这一去如果还能轮回
我愿意来生作牛马
也要与你天涯相随


本文地址:http://com.8s8s.com/it/it42127.htm