托管执行过程

简介: 一、MSDN上的说明 托管执行过程包括下列步骤: 选择编译器。 为获得公共语言运行库提供的优点,必须使用一个或多个针对运行库的语言编译器。 将代码编译为 Microsoft 中间语言 (MSIL)。

一、MSDN上的说明


托管执行过程包括下列步骤:

  1. 选择编译器。

    为获得公共语言运行库提供的优点,必须使用一个或多个针对运行库的语言编译器。

  2. 将代码编译为 Microsoft 中间语言 (MSIL)。

    编译将源代码翻译为 MSIL 并生成所需的元数据。

  3. 将 MSIL 编译为本机代码。

    在执行时,实时 (JIT) 编译器将 MSIL 翻译为本机代码。在此编译过程中,代码必须通过验证过程,该过程检查 MSIL 和元数据以查看是否可以将代码确定为类型安全。

  4. 运行代码。

    公共语言运行库提供使执行能够发生以及可在执行期间使用的各种服务的结构。

 

二、进一步说明


0_1290237985SsH9

 

代码第一次编译形成IL中间语言的托管代码,在运行时被Class Loader装载后进行JIT第二次编译形成托管的本地代码。在执行过程中,它会不断地检查当前我们执行的代码的安全性和规范性。

Class Loader在装载可执行程序exe或者动态链接库dll的时候,它不是把所有的exe和dll当中的类库全部装载到内存里面。它是先装载一部分,即Main函数所在的文件,然后在执行过程中Class Loader会不断地判断当前执行过程中所要调用的方法是否已被装载到内存中了,如果没有,它会实时地去装载一些没有被装载的代码。装载进来之后,被编译为托管的本地代码,然后调用。

-----------------------------------------------------------------------------------------------------------------

程序集(Assemblies)

一个程序集是一组类型和资源的集合,共同组成一定的逻辑功能

包含一个类型或程序的清单(manifest),类型原数据,MSIL,资源

程序集清单描述了应用程序集里面都有哪些类型,这些程序都存放在什么地方。它规定了我的这些代码都在什么地方,可能在磁盘的某个位置,另外的一部分资源可能在Internet上。Manifest最终被Class Loader所用,Class Loader在动态加载类库的时候,就需要知道类库在哪个位置的哪个文件里。我们在编写应用程序的时候,实际上我们可以把程序集清单里面的Assembly的位置描述为在一个互联网上的Http地址,Class Loader在实时地加载这个类的时候它会从Http这个路径去加载远程服务器上的Library过来,这样就实现了零部署,我们不用在更新了Dll之后强迫客户端更新。

所有能够部署的单元都是编译过的MSIL(可执行的中间代码)

轻便的可执行文件(PE file)EXE或者是DLL

在.NET Framework程序在执行的时候,它有一个公共类型系统,这些公共类型系统的实现都在CLR里面。我们在运行程序的时候,使用到了大量的Framework中所定义好的类库,而客户端在执行应用程序的时候实际上已经安装了Framework,也就是说它已经帮我们在客户端部署了很多已经存在的功能。我们的程序在完成后,有很多类库不需要包装在我们的执行文件里面,我们只需要把执行文件放到客户端,去调用客户端的Framework里面的类库。这样我们编写的应用程序规模就很小,但它执行起来内存占用量比较大。

可以用ILDASM和反射(Reflection)来检查程序集

可以是单一的文件或多个文件

相关文章
|
4月前
|
Kubernetes Serverless 调度
异步任务处理系统问题之在阿里云函数计算平台上用户提交异步任务的问题如何解决
异步任务处理系统问题之在阿里云函数计算平台上用户提交异步任务的问题如何解决
|
4月前
|
数据中心 容器
异步任务处理系统问题之任务资源隔离实现的问题如何解决
异步任务处理系统问题之任务资源隔离实现的问题如何解决
|
5月前
|
编译器 C++ 运维
开发与运维编译问题之在C++中创建一个简单的自旋锁如何解决
开发与运维编译问题之在C++中创建一个简单的自旋锁如何解决
27 2
|
5月前
|
SQL 数据采集 DataWorks
DataWorks产品使用合集之依赖脚本实际运行成功了,但其状态却显示为未运行,从而导致下游脚本没有运行,是什么原因
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
存储 Kubernetes 测试技术
阿里云块存储问题之生产代码与测试代码需要同步原子提交如何解决
阿里云块存储问题之生产代码与测试代码需要同步原子提交如何解决
42 0
|
5月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之如何定时运行任务A,以及定时运行任务B,并且任务B能够独立于任务A运行
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
6月前
|
运维 Serverless 文件存储
Serverless 应用引擎产品使用合集之函数实例运行期间相关的依赖资源(vcpu、临时磁盘、GPU)是否会随函数运行完毕而释放
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
移动开发 应用服务中间件 数据库
详尽分享预发环境与生产环境共享数据库时定时任务重复执行问题解决
详尽分享预发环境与生产环境共享数据库时定时任务重复执行问题解决
69 0
|
7月前
|
弹性计算 前端开发 Serverless
Serverless 应用引擎操作报错合集之在阿里云函数计算中,调用了FC函数但是没有执行或者报错,并且在FC函数后台也看不到调用记录日志如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
7月前
|
缓存 弹性计算 Serverless
Serverless 应用引擎操作报错问题之正常运行了两个月,今天更新小功能,结果前后端都报这个错误如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。