当前位置:首页 > Web开发 > 正文

元数据的用途: 避免编译时对C/C++头和库文件的需求

2024-03-31 Web开发

在研究完SuperSocket以后感受对一些高性能代码代码不是很懂,如何进行AppDomain断绝,Process断绝等,细致重温一下Net Clr via.。

CLR 根本 CLR执行模型 1 将源码编译成托管模块

在选择framework平台开发后,就面向CLR进行开发

CLR:一个措施,代码块,平台。可以使得多种编程语言使用运行。为了执行面向CLR的代码,电脑必需要安置CLR(目前作为framework的一部分供给)

核心成果:内存打点,措施集加载,,安适性,异常措置惩罚惩罚,线程同步。

编译器:代码的语法查抄器和分析器。将源码编译成托管模块。

本机编译器:生成面向特定CPU架构(好比x86,x64或ARM)的中间代码。

面向CLR的编译器:

微软开发:C++/CLI、C#、VB、F#、Iron Python、Iron Ruby、中间语言IL

其他编译器:

技术图片

托管模块:标准的32位Microsoft Windows可移植执行体(PE32)文件。或者是标准64位Windows可移植执行体(PE32+)文件。这些文件都需要CLR才华执行。PE:Portable Executable,可移植执行体

托管模块各个部分:PE32或PE32+头、CLR头、元数据、IL中间语言代码

技术图片

IL也称托管代码

元数据:实际上就是一个数据表调集,界说了类型及成员,还有描述引用类型及其成员,其总是和包罗IL代码的文件关联(密不身分);元数据也是老技术的超集,好比COM的类型库(type library)和接口界说语言(Interface definition language,IDL)文件

编译器总是同时生成元数据和中间代码,并将它们嵌入到生成的托管模块,这样元数据和IL永远不会掉去同步。

元数据的用途:

制止编译时对C/C++头和库文件的需求,实现类型和成员的IL中已经含有引用成员类型和成员的全部信息,编译器直接从托管模块中读取元数据。

Visual studio用元数据辅佐写代码。

CLR的代码验证过程使用元数据确保代码执行类型安适的操纵。

元数据允许将东西的字段序列化到内存块,将其发送给另一台机器,然后反序列化。

元数据允许垃圾回收器跟踪东西保留期。

Microsoft的C++编译器的并世无双的,只有它可以允许开发人员同时些托管代码和非托管代码,并生成到同一个模块中。

托管措施集总是操作Windows的数据执行掩护(Data Execution Prevention,DEP)和地点空间构造随机化(Address Space Layout Randomization,ASLR)增强系统的安适性。

2 将托管模块合并成措施集

措施集:一个或多个模块/资源文件的逻辑性分组,是重用、安适性以及版本控制的最小单元。编译器可以生成单文件措施集,也可以生成多文件措施集。

CLR实际和措施集事情,在CLR中措施集相当于组件。

一些托管模块和资源(或数据)文件筹备交由一个工具措置惩罚惩罚,工具生成代表文件逻辑分组的一个PE32(+)文件,PE32文件包罗一个清单的数据块,该清单就是元数据表的调集,表描述了组成措施集的文件,果然导出类型,以及与措施集关联的资源或数据文件。

技术图片

编译器默认将托管模块转换成措施集。措施集可以是可执行的应用措施,也可以是DLL(此中含有一组可执行措施使用的类型)。

措施集中还包罗引用措施集有关的信息(包罗版本号,直接依赖的东西),这些信息为自描述的信息。所以与非托管组件对比,不需要再注册表或Active Directory Domain Services(ADDS)中生存特别的信息。

3 加载大众语言运行时

CLR此刻是作为framework的一部分进行颁布的。

查抄是否安置Framework,需要查抄%SystemRoot%\System32目录中的MSCorEE.dll文件,存在该文件就说明已经安置告成,查抄安置哪个版本请查抄一下目录

%SystemRoot%\Microsoft.NET\Framework

%SystemRoot%\Microsoft.NET\Framework64

.NET Framework SDK供给了CLRVer.exe的命令行使用措施,可以罗列出机器上所有的CLR版本。

如果措施集只包罗类型安适的托管代码,再32位和64位都能运行。

如果需要在特定的CPU架构的非托管代码进行互操纵。C#编译器供给了/platform命令行选项,这个选项的默认项是anycpu,表白最终生成的措施集能在任何版本的windows上运行。vs设置,措施集属性,生成,方针平台。

针对/platform选项内容,编译器编译的措施集是PE32开头(PE32文件在32或64位系统均可以运行)或PE32+开头(需要在64位地点空间)。最后windows还会查抄嵌入的cpu架构信息,确保当前的CPU切合要求。

技术图片

Windows查抄EXE文件头,决定创建32还是64位进程,在进程地点空间加载MSCorEE.dll的x86,x64或ARM版本。

windows x86或Arm版本,MSCorEE.dll在%SystemRoot%/System32目录

Windows x64,MSCorEE.dll在%SystemRoot%System64目录。

进程的主线程挪用MSCorEE.dll中界说的一个要领, 在这个要领初始化CLR,加载EXE措施集,在挪用其入口要领Main,随即托管应用措施启动并运行。

如果非托管应用措施挪用LoadLibrary加载托管措施集,Windows会自动加载初始化CLR措置惩罚惩罚措施集中的代码。

4 执行措施集的代码

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30671.html