托管程序的启动过程(.NETCLR寄宿).pdfVIP

  • 0
  • 0
  • 约3.18千字
  • 约 3页
  • 2023-04-27 发布于江苏
  • 举报
托管程序的启动过程 (.NETCLR寄宿) 托管程序的启动过程 (.NET CLR 寄宿) ⼤家都知道 C# 等托管语⾔编写的代码都会被编译成托管程序 (*.exe 或 *.dll),这些托管程序 最终都会托管给 CLR (公共语⾔运⾏ 时)来执⾏。那么,托管程序的启动过程是怎样的?CLR ⼜是如何寄宿到宿主程序中的?为了回答以上问题,本⽂将⾸先介绍托管程序 的⽣成过程 ;然后介绍托管程序的启动过程,以及该过程中 CLR 的加载流程。 ⼀个托管应⽤程序⾸先被操作系统启动,然后由操作系统调⽤ CLR 来托管该程序。那么 .NET 框架到底以什么⽅式让操作系统认识 CLR 并且可以启动它呢?微软实际将 CLR 作为 COM 服务器实现在⼀个 DLL 中,并提供了标准的 COM 接⼝。既然是 COM 服 务,也就意味着普通的⾮托管程序也可以调⽤ CLR 来运⾏托管代码,我们把这种调⽤⽅式叫做寄宿,把调⽤ CLR 的⾮托管程序叫做 宿主。宿主程序不仅可以调⽤ CLR 来执⾏托管程序 ,还可以通过它来进⾏内存管理、垃圾回收管理、策略管理、事件管理以及线程 控制等⾼级管理。 如上图所⽰,托管语⾔编写的源代码⽂件会被编译成托管模块,多个托管模块连同⼀些资源⽂件会被合并成托管程序 。托管程序 通常有 EXE 和 DLL 两类,其中前者 (EXE)能被操作系统直接启动,后者 (DLL)可以被前者调⽤。托管 EXE 被启动后,操作系统会调⽤ CLR 来托管它。CLR 启动后,会创建 AppDomain 来加载并运⾏托管程序 。 托管模块已经是标准的 PE ⽂件了,为了部署和版本管理的⽅便,编译器会将多个托管模块连同相关的资源合并成⼀个 PE ⽂件,合并⽣成的 PE ⽂件被称为程序 。 PE ⽂件的全称是 Portable Executable,意为可移植执⾏体 (⽂件)。常见的 EXE、DLL、OCX、SYS、COM 都是 PE ⽂件,PE ⽂件是微软 Windows 操作系统上的程序⽂件 (可能是间接被执⾏,如 DLL ⽂件)。 托管程序 的⽣成 如上所述,托管程序 的⽣成要经历两个步骤,⾸先是将源代码编译成托管模块,然后再将多个托管模块及资源 (或数据)⽂件合并成程序 。 1. 将源代码编译成托管模块 如上图所⽰,源代码可以由多种托管语⾔编写,然后由相应的编译器编译成统⼀的托管模块。托管模块是标准的 PE ⽂件,其中除了包含中 间语⾔ (IL)代码和元数据 (Metadata)外,还包含⼀些头信息。 PE32 或 PE32+ 头 :标准的 Windows PE ⽂件头,其标记了⽂件运⾏的系统版本、⽂件类型 (GUI\CUI\DLL)、⽣成时间等。 PE32 ⽂件能在 Windows 32 位或 64 位上运⾏,PE32+ ⽂件只能在 64 位版本上运⾏。 CLR 头 :包含了⼀些托管信息,⽐如 CLR 版本、托管模块⼊⼝⽅法的元数据标记,以及模块的强名称等。 元数据 :主要包含两种类型的表,⼀种类型的表描述源代码中定义的类型和成员 ;另⼀种类型的表描述源代码引⽤的类型和成员。 IL 代码 :编译器编译源代码时⽣成的代码,这些代码将在运⾏时被 CLR (JIT) 编译成 CPU 指令。 2. 将托管模块合并成程序 CLR 实际不和模块⼀起⼯作。相反,它是和程序 ⼀起⼯作的。如上图所⽰,程序 是由多个托管模块 (PE ⽂件)和资源 (或数据)⽂件 合并⽽成的单个 PE ⽂件。合并⽣成的 PE ⽂件中包含⼀个名为 “清单 (Manifest)” 的数据块,其描述了构成程序 的⽂件,由程序 中的⽂件实现的公开类型,以及与程序 关联在⼀起的资源或数据⽂件。 默认情况下,编译器会把⽣成的托管模块转为程序 ,即使只有⼀个托管模块。 将托管模块合并为程序 ,主要是⽅便于⽂件部署及版本管理。 托管程序的启动 前⾯介绍了托管程序 (PE ⽂件)的⽣成过程,托管程序 要么是 EXE ⽂件,要么是 DLL ⽂件。Windows 操作系统可以直接启动 EXE ⽂件,我们来看看托管 EXE 的启动过程是怎样的。 CLR 介绍 在介绍托管程序的启动过程之前,我们先来了解⼀下 CLR 。CLR (Common Language

文档评论(0)

1亿VIP精品文档

相关文档