C#在.NET编译执行过程

1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。

  • 程序集要么是可执行的,要么是DLL
  • 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言
  • 程序集包含如下信息:
    • 程序的CIL
    • 程序中使用的类型的元数据
    • 对其他程序集引用的元数据

2.   程序的编译过程

   程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面步骤:

  • 检查程序集的安全特性
  • 在内存中分配空间
  • 把程序集中的可执行代码发送给实时编译器(JIT),把其中的一部分编译成本机代码。

程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序中执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。

一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像内存释放、数组边界检查、检查参数类型、异常管理等任务。有两个重要的术语由此而生。

  • 托管代码:为.NET框架编写的代码称为托管代码,需要CLR
  • 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码

3.编译和执行过程图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

理解Java里面的jvm,jre,jdk的区别和联系

2946
来自专栏懒人开发

用WebStorm在微信小程序中使用LESS

自己前端不熟悉,很多都需要练习 网上找了一个css的demo, 放到微信小程序后,可以运行

1756
来自专栏性能与架构

使用Redis统计活跃用户

统计活跃用户这个案例非常经典,也是我当时学习redis时,接触到的第一个让我眼睛一亮的使用方式 场景 用户登录后需要记录,以便以后进行登录统计 统计需求主...

2886
来自专栏代码GG之家

深入Android源码系列(一)

? 本文讲解内容有 loadLibrary流程 linker ELF ndk开发以及配置调试版本 ndk-...

2326
来自专栏xingoo, 一个梦想做发明家的程序员

Winsock协议目录

SPI提供3种协议: 1 分层协议     在基础协议的上层,依靠底层基础协议实现更高级的通信服务。 2 基础协议     能够独立安全地,和远程断电实现数...

2156
来自专栏FreeBuf

安全科普:SQLi Labs 指南 Part 1

译者:SQL Libs一直也没看到有人写过比较完整的指南,只有作者在自己的博客上帖了一些tip和一些视频,偶然看到一篇文章在写这个,便拿过来翻一下,以作参考,原...

1749
来自专栏不忘初心

一起看看VIM著名补全插件YouCompleteMe的架构和实现

YouCompleteMe是vim上最著名的插件之一,对于长期使用Linux和vim进行服务端开发的技术人员来说或多或少都有耳闻。

4501
来自专栏轻量级微服务

微服务下跨语言 RPC 实现

目前主流的 Java 开发框架 Spring Boot,为了更方便集成 gRPC,自己开发了 spring-boot-starter-grpc,仅需简单的几行配...

1213
来自专栏木子墨的前端日常

聊聊host中ip/域名映射记录的解析规则

今天宝叔突然在群里发了个问题; host做如下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么?

1082
来自专栏吴柯的运维笔记

如何部署缓存数据库Redis ?

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings)...

2957

扫码关注云+社区