zoukankan      html  css  js  c++  java
  • 引用、程序集、版本 、强命名 、全局文件 CLR学习第三课 狼

    一、代码的执行过程是调用方法的过程,当一个方法被第一次掉用时,Clr将检查该方法引用了那些类型,然后clr尝试加载被引用那个程序集的清单,如果方法引用的类型恰好在该文件中,clr将执行一些内部簿记工作,然后使用该类型。如果清单显示方法的引用类型在其他文件中,clr将试图加载这些文件,并做一些簿记工作,然后开始使用该类型。只有当引用一个类型的方法被调用时,clr才会加载该该类型所在的程序集。只意味着一个应用程序的的运行并不需要其引用的程序集中的所有文件。

    二、程序集版本号格式:主板本号.次版本号.生成版本号.修订号,如.NET2.0中 aspnet_isapi.dll的版本号为:2.0.50727.3053。可以找到exe文件或者dll文件在右键属性中查看版本号,作者、公司、名称等许多信息。也可以在vs中打开查看版本信息。

    三、当clr需要定位一个文件时,他将扫描应用程序的的几个子目录,优先扫描当前目录,然后再一级一级的往下,扫描相应的dll文件。当dll文件扫描结束没有没有发现程序集,接着扫描对应的exe文件,如果都没有发现则抛出异常,FileNotFounException。

    四、强命名程序集、弱命名程序集;

    弱命名程序集(只能进行私有部署):只能在当前应用程序的基目录或者子目录下。就是在当前项目下,如果是当前项目的程序集没有进行强命名,而把该程序集在其他项目中用外部引入的方式使用将出现错误。(没有进行强命名签名的 其共有密钥标记显示为)

    强命名程序集可以全局部署,即可以在任意的地方引用,拷贝到其他项目应用中正常使用。强命名程序集被加入了共有密钥标记(公钥/密钥对),而且是唯一性的名称。所以在任何地方,都不会产生相同的同名的情况(因为可能不同的公司,会在某些情况下,产生的程序集名称相同,会导致文件引用指向不明;文件覆盖等操作,这就是弱命名程序集只能私有部署的原因,强命名程序集成功的解决了这一个办法,在项目属性中--签名*下可以设置强命名密钥文件)。目的:程序集不被篡改。

    五、全局程序集缓存(GAC--Global Assembly Cache),其位于 c:\windows\assmbly文件夹下。目的就是为了在强命名程序集和子目录直接维持一个关系。CLR有一个内部函数用,他接受程序集名称、版本、语言、共有密钥标记四个参数。返回指定的程序集文件所在的子目录的路径。

    GAC-实现了许多应用程序集共享,从整体上减少了使用物理内存;并且只能以管理员的身份很容易的添加一个新版的程序集部署到GAC中。

    每一个安装程序都有一个目录,以及存放共享程序集的目录;当我们将安装程序安装在目录中时,还需要安装一个xml的配置文件,并将共享程序集的codeBase(实际上是个url,本地的或者网络的,网络的就下载)元素指向其所在的实际路径,在样在程序运行时clr将知道在强命名程序集的目录中查找共享程序集。

    六、强命名程序集防篡改:当程序集被安装到GAC目录时,系统将对包含清单的文件进行散列转换,并有进行了散列转换的值和嵌入到pe文件中的RSA数字签名进行比较(在共有密钥“反签名”之后),如果不同就证明程序集被修改过。系统还会对程序集的其他文件内容进行散列转换,然后以FileDef中的散列值进行比较,发现任何不匹配,就就证明程序集被篡改。

    七、延迟签名:产生一个公司的共有密钥(不参数公钥/密钥对)存放在文件中。

    八、clr执行过程:当我们运行应用程序时,clr将加载并初始他,然后clr会读取该程序集的clr表头来寻找应用程序的入口点方法(Main)的MethodDefToken。根据MethodDef元数据表,clr会定位到该方法的IL代码所在处的偏移,然后将其一jit的方式编译为本地代码,同时完成代码的类型安全验证过程,然后执行编译后的本地代码

  • 相关阅读:
    vue中使用axios
    vue中报错Do not use built-in or reserved HTML elements as component id details
    人月神话阅读笔记01
    学习进度周总结(第五周)
    石家庄地铁系统开发(java web版)(一)
    梦断代码阅读笔记03
    二维数组求最大子数组
    学习进度周总结
    梦断代码阅读笔记02
    二维数组
  • 原文地址:https://www.cnblogs.com/gowhy/p/2003649.html
Copyright © 2011-2022 走看看