当运行一个.NET应用程序时,OS会先建立一个进程,检查PE文件,执行PE文件中的.text段中的code, 在托管程序编译时,.text段里面增加了一条JMP_CorExeMain或JMP_CorDllMain指令(根据是exe文件还是dll文件不同)。若是非托管程序,就进入到入口函数了,若是托管程序就会跳入到另一个函数中。这个函数在一个叫做MSCorEE.dll的动态链接库文件中,当安装了.net框架时就会被复制在系统目录下。系统会根据托管程序PE文件中的信息找到这个DLL,然后通过MSCorEE.dll的PE文件信息找到这个_CorExeMain函数的入口地址,然后修改刚才的JMP指令要跳转的地址,从而将控制跳转到了_CorExeMain这个函数里面去。然后,在这个函数里面,CLR被启动了,并做了若干的初始化工作,在加载CLR时会创建一个默认的AppDomain,它是CLR的运行单元,程序的Main方法就是在这里执行,这个默认的AppDomain是唯一且不能被卸载的,当该进程消灭时,默认AppDomain才会随之消失。加载后,再通过托管程序的CLR表头找到托管程序的入口地址,并将控制跳转到这里,于是托管程序开始运行。
托管程序编译的结果是IL中间代码,且IL代码是由CLR实施编译的。实际上,IL中的方法并不是每次被调用时都会被JIT Complier重新编译一次,而是采用“LazyLoad”,只有在第一次被调用的时候才会被编译。即时编译器保存有一个映射表。当调用一个方法时,即时编译器如果发现在这个映射表中没有标记这个方法,就会将这个方法的IL代码编译成CPU指令,然后分配在一个内存空间上,然后在这个映射表中记录下这个方法名和方法入口对应的内存地址,然后通过JMP指令跳转到函数中去。当下次再产生对这个方法的调用时,即时编译器因为已经知道了这个方法对应的内存地址,因此就会直接通过JMP指令跳转,而不会再次编译这段代码。
分享到:
相关推荐
您必须首先将一个程序集加载到应用程序域中,然后才能运行该应用程序。运行普通的应用程序会导致将几个程序集加载到一个应用程序域中。默认情况下,公共语言运行库将一个程序集加载到包含引用该程序集的代码的应用...
本指南主要侧重于“平移”场景,最初主要考虑对基于 ... 本指南将介绍如何将基于.NET Framework 的现有服务器端应用程序的不同方面进行现代化 改造,随后直接迁入云端运行,但并不重构整个应用程序或更改其代码。
Microsoft.NET框架程序设计》(修订版)是《微软.NET程序员系列》丛书之一,主要介绍如何开发面向Microsoft.NET框架的各种应用程序。Microsoft.NET框架是微软公司推出的新平台,包含通用语言运行时(CLR)和.NET框架...
你创建了一个ASP.net应用程序,该程序将运行在TK公司的WEB站点上。你的应用程序包括100个WEB页面。你想配置你的应用程序,当HTTP代码发生错误时,可显示自定义的错误信息给用户。同时你想当程序发生错误时记录到日志...
使用基于服务的体系结构实现电子商务网站的参考 .NET 应用程序。 (仅限 Windows)安装 Visual Studio。Visual Studio 包含你希望拥有的对 .NET Aspire 的工具支持。Visual Studio 2022 版本...或者从终端运行应用程序
8.3 ASP.NET应用程序中的用户状态管理 8.3.1 Global.asax文件概述 8.3.2 Application对象事件 8.3.3 Session对象事件 8.3.4 其他几种客户端的用户状态管理方法 8.3.5 本小节提示 8.4 ASP....
本书全面介绍ASP.NET的基础知识和网络应用程序设计方法。全书由9章组成:内容包括ASP.NET运行及编程环境、HTML语言、VB.NET语言基础、VB.NET面向对象程序设计、ASP.NET基本语法与常用内置对象、Web窗体及服务器控件...
构建 .NET Web 应用程序的过程中使用了很多技术。为了构建有效的应用程序级别的身份验证和授权策略,您需要了解如何在每一种产品和技术领域内优化各种安全功能,以及如何使它们协同作用以提供纵深防御的有效安全策略...
8.3ASP.NET应用程序中的用户状态管理 8.3.1Global.asax文件概述 8.3.2Application对象事件 8.3.3Session对象事件 8.3.4其他几种客户端的用户状态管理方法 8.3.5本小节提示 8.4ASP.NETHTFP运行情况 8.4.1HTYP运行‘晴...
VB.NET Winform窗口后台运行+防多开+开机后台自动启动示例 可用于制作一个开启自动启动的后台运行程序,并且自带窗口可唤出显示
使用方法 ...在程序开始运行加载的事件里写调用代码: 例: private void Form1_Load(object sender, EventArgs e) { this.skinEngine1.SkinFile = @"\RealOne.ssk"; } 我也是下载别人的东西 一起分享吧
本书是在讲授Visual C#.Net 应用程序课程的讲义和教案的基础上整理编辑而成。本书内容几乎涵盖了使用C#语言开发Windows应用程序和Web应用程序(ASP.Net)的各个方面。为了说明问题,在介绍程序设计方法时,一般使用...
本课程介绍使用VB.NET开发Windows应用程序所需的知识和技能 预备知识 掌握基本的VB.NET语法 掌握数据库的基本知识 掌握面向对象的编程思想 能够使用Visual Studio.NET图形化界面开发环境 课时:108 课时 分为两部分 ...
写了一个控制台应用程序,发布成文件夹的 复制到客户服务器之后打开就闪退了。 在本机电脑上面运行得好好的,百度查询是缺少.NET 5.0 的运行时因为我是用.NET 5.0框架写的,所以我就去官网下载了.NET 6.0 但是没用...
一个没有安装IIS环境运行 Asp.Net web应用程序的例子
.NET 6即Microsoft .NET Runtime 6.0,.NET 6是微软最新推出的NET框架运行库,是Windows操作系统用于.NET Framework构建的应用程序所需的基础类型库组件。NET Runtime(Net运行库)是继Windows DNA之后的一个全新...
本文实例讲述了在.net应用程序中运行其它EXE文件的方法。分享给大家供大家参考。具体实现方法如下: Process proc = new Process(); proc.StartInfo.FileName = @D:\Program Files\Foxmail\Foxmail.exe; //可以用...
.NET应用程序运行状况检查很容易 我为什么要这个? 要轻松生成类似这样的内容: : 。 扩展Web应用程序时,遇到的第一批工具包之一是负载平衡器。 在部署新版本的应用程序时,我们通常将一台计算机从负载平衡池中拉...