CLR是如何被加载并工作的

当运行Windows应用程序的时候,CLR总是默默地为服务着。CLR到底是如何被加载并运行呢?

 

首先,Microsoft专门为CLR定义了一个标准的COM接口。

 

安装某个版本的.NET Framework,CLR被包含在DLL中,作为COM服务器在Windows注册表中注册。

 

一台电脑上可能安装多个版本的CLR。打开开发人员命令提示,输入CLRVer.exe,可以看到当前电脑上安装的CLR版本。

比如,在C:\Windows\Microsoft.NET\Framework\v2.0.50727文件夹中,CLR被包含在mscorwks.dll中;在C:\Windows\Microsoft.NET\Framework\v4.0.30319文件夹中,CLR被包含在clr.dll中。

 

当双击一个应用程序,就启动一个独立的Windows进程,在.NET最新版本文件夹中有一个类似MSCoreEE.dll的组件去读取应用程序的.NET版本,然后把对应的某个CLR版本加载到进程中。总之,CLR是寄宿在进程内的。

 

一个进程中可以有几个CLR版本吗?
从.NET 4.0起,就可以在一个进程中加载多个CLR版本,而且还不会造成兼容性的问题。

 

CLR是什么时候卸载的?
只有当终止进程的时候才能卸载CLR。

 

CLR加载mscorlib中所有的程序集。

 

CLR加载托管堆。

 

CLR加载应用程序域,而且还可以加载多个应用程序域,默认加载的应用程序域是被设置为"启动项目"的那个。

 

在应用程序域内运行多个线程,有些线程是主线程,有些线程是工作线程。

 

转载于:https://www.cnblogs.com/darrenji/p/4159259.html

### CLR (.NET Common Language Runtime) 的概念及功能 CLR(Common Language Runtime),即公共语言运行时,是 .NET 平台的核心组件之一。它负责管理应用程序的执行过程,提供一系列服务来支持程序开发和运行环境的需求[^2]。 #### CLR 的主要功能 1. **内存管理** CLR 提供自动化的垃圾回收机制(Garbage Collection, GC),能够动态分配和释放对象所占用的内存资源,从而减少开发者手动处理内存的工作降低错误发生率。 2. **代码验证与安全性** 在运行之前,CLR 对中间语言(Intermediate Language, IL)代码进行验证以确保其类型安全性和合法性。这有助于防止恶意代码或不合规的操作被执行[^3]。 3. **即时编译 (JIT Compilation)** 当应用程序加载CLR 中时,其中间表示形式会被转换成目标计算机架构上的原生指令集。此操作由 JIT 编译器完成,在每次调用方法前将其翻译为高效的机器级代码[^4]。 4. **异常处理** 它定义了一套统一的标准用来捕获、抛出以及响应运行期间发生的任何意外情况或者错误状态;使得不同类型的错误都能得到妥善处置而不至于影响整个系统的稳定性. 5. **跨语言互操作性** 不同基于 .NET 的高级编程语句最终都会被编译成为相同的低层次表达——MSIL(Microsoft Intermediate Language),因此来自多个源文件即使采用完全不同的语法结构也依然能够在同一个进程中无缝协作工作。 6. **线程支持** 借助内置多任务调度框架,允许单个进程内部创建发执行路径以便更好地利用现代硬件特性比如多核CPU等优势提升性能表现。 7. **类库访问权限控制** 只要遵循一定规则编写出来的软件模块就可以无障碍地共享公共资源而无需担心冲突问题出现因为存在严格的命名空间划分体系再加上细粒度授权策略共同保障了整体生态系统的健康运转状况良好。 8. **调试诊断工具集成能力** 开发者可以通过专门接口获取关于当前正在活动中的实例化对象的信息以及其他有用统计数据帮助定位潜在缺陷所在位置加快修复速度提高产品质量水平。 ```csharp // 示例:简单的 C# 应用展示如何依赖 CLR 来实现基本功能 class Program { static void Main(string[] args){ string greetingMessage = "Hello World!"; Console.WriteLine(greetingMessage); // 输出字符串至控制台 int numberA = 5; double resultB = Math.Sqrt(numberA); // 调用了 BCL(System.Math 类型的一部分) System.Console.WriteLine($"Square root of {numberA} is {resultB}"); } } ``` 上述例子展示了几个关键方面: - 使用 `Console` 类打印消息给终端用户。 - 访问 Base Class Library(BCL卡顿基础类别函式庫)里的静态成员函数计算平方根值。 这两个动作都需要依靠底层基础设施的支持才能顺利完成任务。 --- ### §相关问题§ 1. 如何自定义配置 CLR 加载行为? 2. CLR 和 JVM (Java Virtual Machine)之间有哪些异同之处? 3. 是否可能绕过 CLR 直接生成可执行二进制文件? 如果可以的话具体步骤是什么样的呢 ? 4. 面向对象原则怎样体现在 CLR 设计当中去体现出来 ? 5. 在实际项目里我们该如何优化 CLR 性能指标达到最佳效果 ?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值