CLR Via C#: CLR 的执行模型

本文介绍了CLR(公共语言运行时)的基本概念,包括源代码到中间语言的编译过程,托管模块的组成,以及如何判断.NET Framework是否安装。此外,还详细解析了通用类型系统(CTS)的规则,如成员种类、访问级别以及类型继承等方面。

CLR(Common Language Runtime)公共语言运行时:是一个可由多种编程语言使用的“运行时”。

编译源代码文件的过程:

  • C# 源代码文件 -》 C# 编译器-》托管模块(中间语言和元数据)
  • Basic 源代码文件 -》 Basic 编译器-》托管模块(中间语言和元数据)

托管模块的各个组成部分:

  • PE32 或PE32+头
  • CLR头
  • 元数据 - 是一组数据表,其中一些数据表描述了模块中定义的内容,比如类型及成员。还有一些数据表描述了托管模块引用的内容,比如导入的类型及其成员。
  • IL(中间语言)代码

判断是否已安装.NET Framework, 只许判断C:\Windows\System32目录中是否存在文件mscoree.dll。 一台及其可能同时安装好几个版本的.NET Framework, 需要到注册表中查看:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup

 

通用类型系统(Common Type System)CTS规定,一个类型可以包含零个或者多个成员:

  1. 字段(Field)—— 一个数据变量,是对象状态的一部分。字段根据名称和类型来区分
  2. 方法(Method)—— 一个函数,能针对对象执行一个操作,通常会改变对象的状态。方法有一个名称、一个签名以及一个或多个修饰符。
  3. 属性(Property)—— 对于调用者,该成员看起来像一个字段。但对于类型的实现者,它看起来像是一个方法(或者两个方法,称为getter 和setter)。
  4. 事件(Event)—— 事件在对象以及其他相关对象之间实现了一个通知机制。例如,利用按钮提供的一个事件,可以再按钮被单击之后通知其他对象。

CTS 还指定了类型可视性规则以及类型成员的访问规则:

  1. private: 成员只能由同一个类(class)类型中的其他成员访问
  2. family:成员可由派生类型访问,不管那些类型是否在同一个程序集
  3. family and assembly:成员可由派生类型访问,但这些派生类型必须是在同一个程序集中定义的
  4. assembly:成员可由同一个程序集中的任何代码访问
  5. family or assembly:成员可由任何程序集中的派生类型访问
  6. public: 成员可由任何程序集中的任何代码访问

除此之外,CTS还为类型继承、虚方法、对象生存期等定义了规则。

CTS规定:所有类型最终必须从预定义的System.Object类型继承。System.Object类型允许做下面这些事情:

  1. 比较两个实例的相等性
  2. 获取实例的哈希码
  3. 查询一个实例的真正类型
  4. 执行实例的浅(按位)拷贝
  5. 获取实例对象的当前状态的一个字符串表示

 

于非托管代码的互操作性 - CLR 支持三种互操作情形:

  1. 托管代码能调用DLL中的非托管函数
  2. 托管代码可使用现有的CMO组件(服务器)
  3. 非托管代码可使用托管类型(服务器)

转载于:https://www.cnblogs.com/LilianChen/p/7655273.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值