.net知识和学习方法系列(十六)CLR-托管理程序和它的运行

简介:
大家都知道,vs 生成的是托管理程序(不管是VB.net 还是C# ),托管理程序是什么呢?托管这个词就能隐约得告诉我们,这个程序运行时不那么“单纯”,其实,托管理程序是不可以直接在CPU 上运行的,至于为什么,我们先看一下托管程序的组成部分。
一般托管理程序分为
PE 文件头:包含文件的类型,还有生成文件的时间
CLR 头:包含CLR 版本,入口方法的元数据标记
元数据:定义的类型和成员,引用的类型和成员
IL (中间语言):编译源代码时生成的代码
 
现在来看一下托管理代码的运行,有这样一个简单的方法
using System;
class Democlass
{
    static void Main()
    {
        Console.WriteLine(" 谢谢!");
        Console.WriteLine(" 阅读。");
Console.WriteLine(" 再见!");
    }
}
IDE 把把这个代码编译成exe 后,我们运行起这个exe( 当然是在装有.net Framework 的计算机上) ,首先CLR 会扫描所有这个Main 方法中的类型,然后会创建一个用于管理这些类型的数据结构,虽然本例中只有一种类型Console ,并且还是一个静态类。在这个数据结构中,存放着很到记录,每个记录与Console 的一个方法对应着,每个记录中,包含着一个指向方法实现的内存地址。
当这个数据结构初始化时,CLR 就将数据结构中的每条记录指向一个在CLR 中已定义好的方法CallMethod( 我假设的名子) ,这个方法能根据记录找到方法实现,当执行Console.WriteLine(“ 谢谢!”) 时,会在数据结构中找到对应的记录,这个记录会调起CallMethod 方法,CallMethod 这个方法要实现  步骤如下:
A.          调用元数据中的WriteLine 方法( 因为记录与CallMethod 关联,记录指向方法的实现地址,所以CallMethod 能调用WriteLine 方法)
B.          从元数据中得到这个方法的IL
C.          申请一块内存空间
D.          把这个方法编译成CPU 指令,放到申请的内存空间中
E.           然后这个方法返回到这个数据结构中的WriteLine 方法对应的那条记录,用申请的内存地址替换掉这个记录包含指向方法实现的内存地址(这里就是用CPU 指令所在的内存地址替换掉了实现方法的内存地址)
F.           返回Main 方法的Console.WriteLine(“ 阅读”)
 
CLR 执行Main 方法的Console.WriteLine(“ 阅读”) 时,因为记录中的内存地址已变成了CPU 指令所在的内存地址,所以这次,CallMethod 方法就不用被重新调用,这就说明,一旦该方法第一次被调用过,以后的调用就相对的节省资源了。直到该程序中止退出。

如果该程序在一台计算机上启动了两个,它们的这个该方法的CPU指令是不会被共用的,因为他们不在一个Application Domain,不能跨域访问。



















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/149964 ,如需转载请自行联系原作者



相关文章
|
20天前
|
算法 API 数据安全/隐私保护
.NET使用原生方法实现文件压缩和解压
.NET使用原生方法实现文件压缩和解压
.NET使用原生方法实现文件压缩和解压
|
1月前
|
开发框架 JSON .NET
学习ASP.NET 中的 默认应用程序配置源
默认主机配置源 使用命令行配置提供程序的命令行参数
22 2
|
1月前
|
前端开发 Java C#
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
GitHub突破5k Star!这件事情我坚持了3年,努力打造C#/.NET/.NET Core全面的学习、工作、面试指南知识库
|
29天前
|
存储 安全 C#
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
技术心得记录:强命名的延迟与关联在.net程序集保护中的作用及其逆向方法
|
29天前
|
开发框架 前端开发 JavaScript
程序与技术分享:ASP.NET发展史(【译】)
程序与技术分享:ASP.NET发展史(【译】)
19 0
|
1月前
|
网络协议
技术好文:Smark.Net实现简单聊天程序
技术好文:Smark.Net实现简单聊天程序
15 0
|
1月前
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
|
2月前
|
开发框架 .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。详细信息和下载链接在文中给出。
129 4
|
2月前
|
开发框架 .NET C语言
LabVIEW中使用.NET方法时出现错误1316
LabVIEW中使用.NET方法时出现错误1316
47 4
|
1月前
|
自然语言处理 C# 图形学
​一款开源的.NET程序集反编译、编辑和调试神器
本文介绍了.NET反编译和调试工具dnSpyEx的使用方法。dnSpyEx是dnSpy的非官方Fork版本,支持.NET Framework、.NET Core和Unity程序集的调试和编辑,具有多种语言界面。主要功能包括:浅色、蓝色和深色主题,调试支持,代码编辑以及多语言支持。用户可以从GitHub下载并直接运行dnSpyEx,无需安装。通过创建测试项目,编译成dll文件,然后使用dnSpyEx进行调试和编辑程序集中的代码和IL指令。此外,文章还提供了项目源码地址和相关优秀项目的链接。