• C#基础系列程序集


    一、前言

      通过学习反射的原理、元数据的内容,延申了解程序集(Assembly)的内容,在vs中创建一个解决方案,解决方案中创建多个项目或者类库、在项目中创建多个类文件(类中定义各种各样的成员变量)然后通过VS编译器将代码编译成.exe文件或者.dll文件。那么问题一、这些文件的内容由什么构成的?问题二、计算机是如何加载这些文件内容到内存中运行程序?问题三、程序集是什么?

    二、内容

      应用程序在计算机中运行起来会创建一个应用程序域(AppDomain)、一个程序域包含所有程序集(Assembly)、通过加载Assembly到内存,Assembly包含类(Class)信息,通过元数据(metadata)各清单将程序集、类(成员)、特性加载到内存中。

      通过一张图表示C#高级语言创建的程序代码如何在计算机中运行,从编译器中编写、编译器中编译、JVM中(运行时环境)、计算机中机器语言(01)运行,整个过程如下图所示:

        

    可执行文件(PE)的构成
    PE 标头

    PE 文件主要部分的索引和入口点的地址。

    运行库使用该信息确定该文件为 PE 文件并确定当将程序加载到内存时执行从何处开始。

    MSIL 指令        组成代码的 Microsoft 中间语言指令 (MSIL)。许多 MSIL 指令带有元数据标记。
    元数据   元数据表和堆。运行库使用该部分记录您的代码中每个类型和成员的信息。本部分还包括自定义属性和安全性信息。

         程序集(Assembly)的构成
    程序集的元数据   程序集元数据也叫清单,它记录了程序集的许多重要信息,是程序集进行自我说明的核心文档。当程序运行时,CLR 通过这份清单就能获取运行程序集所必需的全部信息。清单中主要主要包含如下信息:标识信息(包括程序集的名称、版本、文化和公钥等);文件列表(程序集由哪些文件组成);引用程序集列表(该程序集所引用的其他程序集);一组许可请求(运行这个程序集需要的许可)
    类型元数据 类型元数据列举了程序集中包含的类型信息,详细说明了程序集中定义了哪些类,每个类包含哪些属性和方法,每个方法有哪些参数和返回值类型,等等
    MSIL代码 程序集元数据和类型元数据只是一些辅助性的说明信息,它们都是为描述MSIL代码而存在的。MSIL 代码是程序集的真正核心部分,正是它们实现了程序集的功能;通过编译器将代码编译成中间语言IL,在各操作系统平台通过.NET平台运行时(CLR/JIT)等将IL生成机器码执行。
    资源文件 程序集中还可能包含图像、图标、声音等资源
           程序集(Assembly)的类型
    私有程序集 私有程序集是对于应用程序单独所有,通过vs生成的文件,复制到程序文件夹既可以运行
    共享程序集 共享程序集是被不同应用成所调用,使用比如.NET类库的程序集,必须考虑命名冲突和版本冲突等问题。解决这些问题的办法是把共享程序集放在系统的一个特定文件夹内,这个特定文件夹称为全局程序集高速缓存(GAC)。这个过程可用专门的.NET 工具完成。

     三、总结

      通过上述内容,深入理解程序集的构成情况,了解计算机内存是如何加载程序代码文件,然后cpu读取指令和数据信息。我们平时编写代码的时候考虑多的是业务逻辑怎么编写,很少会考虑这个代码文件在编译器中编译之后发生了什么,生成的是什么。那么了解这些底层的信息一样帮助我们更好的理解程序代码。

  • 相关阅读:
    莎士比亚名言
    庄子名言
    Javascript: 通过图片url获取图片blob对象
    toast提示 封装
    maya模型导入UE4,如何做到等比导入
    GPU渲染和CPU渲染农场成本对比
    C4D渲线框
    C4D教程笔记——高科技线框3D模型全息投影 X-Wing Hologram Animation
    arnold和redshift渲染器
    使用Redshift渲染器,怎么选电脑配置!
  • 原文地址:https://www.cnblogs.com/tuqunfu/p/15923454.html
Copyright © 2020-2023  润新知