重新学.Net[二]——从编译到运行

简介:
一个托管的程序,从书写代码到编译到最后运行,到底是怎么一个过程,一直有些混沌,好好看了下书,梳理了一下。
托管的程序是二次编译的,因此一个托管程序从第一次编译到最后的运行可以根据这两次编译的目的性不同分成两个阶段。
第一个阶段是从不同的语言编写的代码通过各自不同的编译器编译生成dll和exe文件。第一次编译生成的dll文件和exe文件统称为托管模块。它们由PE表头,CLR表头,IL,元数据几部分组成。PE表头是存放操作系统(Windows)识别模块需要的一些信息;CLR表头是CLR的一些标识信息;IL是中间代码,描述模块中各方法的执行过程;元数据是托管模块的基石,它描述了代码中类型和成员的信息。这些托管模块组合成为程序集(这是一个逻辑概念),程序集中除了托管(可以是1对n,但通常是1对1),还有资源文件和一个描述清单。程序集是程序部署和CLR操作的基本单位,通常安装一个托管程序,就是指将这些程序集部署到机器上(这种说法比较简单,机器还需要环境)。
然后,程序进入第二个阶段,运行阶段。通常运行一个托管程序是从非托管程序(宿主)进入。这时候操作系统会判断PE中的信息,不同的宿主根据不同的方式启动CLR。CLR是以COM服务器的形式安装在机器上的。CLR会初始化应用程序,建立一个应用域AppDomain。应用域中包含程序集和托管堆和栈。应用域是托管程序运行的环境,一个应用域中的程序不能访问其他域的内容(可以通信,可以通过中立域)。程序的运行中需要第二次编译,第二次编译采用JIT(Just In Time)方式(也可以不采用JIT,而提前全部编译),简单的说,就是第一次用到某程序集中某方法的时候,才加载该程序集的该部分,编译之后存放在堆中,下次运行的时候就可以直接调用了。在JIT中有一个不同于非托管程序的重要部分是验证,验证包括很多方面的内容,以保证程序的安全运行。关于JIT的性能问题,在别的文章中我会好好写的。









本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/361610,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
28天前
|
前端开发 Android开发
WinForm 直接运行 Admin.NET
本文介绍了如何将 Admin.NET 以 WinForm 桌面程序模式运行,简化了手动配置 Web 服务的过程,便于演示和作为单机软件使用。通过添加特定 NuGet 包、修改 `Program.cs` 和 `Form1.cs` 文件,并调整项目配置,最终实现了在 WinForm 中嵌入 WebView 组件显示 Admin.NET 界面的效果。
22 0
WinForm 直接运行 Admin.NET
|
4月前
|
开发框架 .NET 开发工具
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
【Azure 应用服务】App Service 的.NET Version选择为.NET6,是否可以同时支持运行ASP.NET V4.8的应用呢?
|
4月前
|
开发框架 监控 .NET
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
|
4月前
|
Android开发
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
解决Android、Flutter编译时Gradle报错:javax.net.ssl.SSLException: Connection reset
478 0
|
7月前
|
开发框架 .NET API
在Windows Server 2008 R2上运行.Net 8应用
在Windows Server 2008 R2上成功运行.Net 8程序,需安装三个补丁:Windows Server 2008 R2 SP1 (KB976932)是基础更新;VC_redist.x64提供MSVC库支持;KB3063858解决.NET运行时加载`kernel.dll`的路径问题。KB3063858可能需要KB2533623。详细信息和下载链接在文中给出。
526 4
|
开发框架 缓存 .NET
.NET Core 项目启动时运行定时任务
.NET Core 项目启动时运行定时任务
93 0
|
Docker 容器
.NET Core 网站项目在Docker中运行无法访问问题处理
.NET Core 网站项目在Docker中运行无法访问问题处理
505 0
|
7月前
|
应用服务中间件 nginx
Angular打包构建项目服务器运行runtime.js、polyfills.js、vendor.js报错net::ERR_ABORTED 404 (Not Found),build修改为相对路径./
Angular打包构建项目服务器运行runtime.js、polyfills.js、vendor.js报错net::ERR_ABORTED 404 (Not Found),build修改为相对路径./
|
安全 网络协议 JavaScript
Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用
Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用
369 0
Open-Dis的C++版本编译(CMake-gpu 3.21.4)以及SDL2和SDL_net库的配置使用