.NET程序如何启动?
.net程序如何启动?
.NET Framework在Windows平台顶部运行,这意味着.NET Framework必须使用 windows可以理解的技术来构建。首先,所有托管模块和程序集文件都必须使用windows PE文件格式,而且要么是一个windows EXE文件,要么是一个DLL文件。
.net程序建立在CLR之上,因此.net程序的运行需要先加载正确的CLR环境。这样我们把问题的关注点转变为:
1、如何正确地加载CLR环境?
2、如何进入.net程序的Main函数?
为了更好地理解这个过程,我使用dumpbin.exe工具来解析PE文件格式并且转储出PE文件的内容。dumpbin.exe在visul studio中的Visul studio Tool的工具命令提示。我使用下面命令转储PE文件内容,
D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC>dumpbin -all assembly>e:\dump.txt
转储部分内容如下:
OPTIONAL HEADER VALUES
10B magic # (PE32)
11.00 linker version
A00 size of code
800 size of initialized data
0 size of uninitialized data
29AE entry point (004029AE)
2000 base of code
4000 base of data
400000 image base (00400000 to 00407FFF)
2000 section alignment
200 file alignment
4.00 operating system version
Entry point域表示PE文件的入口地址 值为Ox004029AE
要找出位置Ox004029AE所对应的代码,需要查看PE映像的.text段,部分内容如下:
00402980: 00 00 00 00 00 00 00 00 90 29 00 00 00 00 00 00 .........)......
00402990: 00 00 5F 43 6F 72 45 78 65 4D 61 69 6E 00 6D 73 .._CorExeMain.ms
004029A0: 63 6F 72 65 65 2E 64 6C 6C 00 00 00 00 00 FF 25 coree.dll.....?%
004029B0: 00 20 40 00
粗体字节对应于Entry Point,这些字节对应的机器指令为JMP 402000。要找到Ox402000指向的内容,我们可以查看PE文件的导入段,可以发现如下内容:
Section contains the following imports:
mscoree.dll
402000 Import Address Table
402988 Import Name Table
0 time date stamp
0 Index of first forwarder reference
0 _CorExeMain
Ox402000指向的是mscoree.dll,这个库包含一个导出函数_CorExeMain。_CorExeMain是mscoree.dll的一部分,这个函数也是加载.net程序集时第一个被调用的函数。mscoree.dll的主要作用是启动CLR。mscoree.dll在启动CLR时将执行一系列工作:
1、通过查看PE文件中的元数据,找出.NET程序集是由哪个版本的CLR构建的。
2、找出操作系统中正确版本CLR的路径
3、加载并初始化CLR
在CLR被初始化之后,在PE映像的CLR头中找到程序集的入口点(Main()),然后JIT开始编译并执行入口点。
.NET程序集加载算法如下:
1、用户执行一个.NET程序集
2、windows加载器查看AddressOfEntryPoint域,并找到PE映像文件的.text段。
3、位于AddressOfEntryPoint位置上的字节只是一个JMP指令,这个指令跳转到mscoree.dll中的一个导入函数。
4、将执行控制转移到mscoree.dll中的函数_CorExeMain中,这个函数将启动CLR并且把执行控制转移到程序集的入口点。
.NET程序如何启动?的更多相关文章
- 【原】iOS学习之应用程序的启动原理
最近看视频了解了一下应用程序的启动原理,这里就做一个博客和大家分享一下,相互讨论,如果有什么补充或不同的意见可以提出来! 1.程序入口 众所周知,一个应用程序的入口一般是一个 main 函数,iOS也 ...
- Ubuntu 设置程序开机启动(以指定用户身份)
一.方法 在/etc/rc.local写程序的启动命令(系统执行内核过程中会启动init进程,该进程把当前runlevel所对应的的所有service 都启动后,才会执行rc.local里的命令),程 ...
- 解决Pyqt打包后运行报错:应用程序无法启动 因为程序的并行配置不正确
做了一个生成二维码的小程序:http://www.cnblogs.com/dcb3688/p/4241048.html 直接运行脚本没问题,用pyinstaller打包后再运行就直接报错了: 应用程序 ...
- C#禁止程序重复启动
采用线程互斥锁Mutex,在winform程序的主入口点中加入如下代码,将程序改为单实例运行. static class Program { /// <summary> /// 应用程序的 ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- 如何解决"应用程序无法启动,因为应用程序的并行配置不正确"问题
应用程序事件日志中: "C:\windows\system32\test.exe"的激活上下文生成失败.找不到从属程序集 Microsoft.VC80.MFC,processorA ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- iOS的常见文件及程序的启动原理
一. iOS中常见文件 (一). Xcode6之前 创建项目,默认可以看见一个存放框架的文件夹 info文件以工程文件名开头,如:第一个项目-Info.plist 项目中默认有一个PCH文件 (二). ...
- iOS程序的启动过程-UIWindow
UIApplicationMain main函数中执行了一个UIApplicationMain这个函数 int UIApplicationMain(int argc, char *argv[], NS ...
- 提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll
新版本SQLITE,如果下载Precompiled Binaries版会出现提示“应用程序无法启动,因为应用程序的并行配置不正确”不能加载 System.Data.SQLite.dll. 下载Prec ...
随机推荐
- 限制goroutine数量写法
虽然golang的goroutine可以开启无数个goroutine,但是没有限制也是不行的.我就写一下我对goroutine数量限制的写法 1.初始化goroutine协程池.把goroutine数 ...
- 20162305 实验二 Java面向对象程序设计 实验报告
20162305 实验二 Java面向对象程序设计 实验报告 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D ...
- 20162324 2016-2017-2《Java程序设计》课程总结
20162324 2016-2017-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业01 有关老师与学生关系的几个问题: 预备作业02 做中学: 预备作业03 实验楼学习: ...
- Android 6.0中在/dev下添加新设备驱动下Selinux相关设置【转】
本文转载自:https://blog.csdn.net/fantasy_wxe/article/details/52013922 错误1: 07-23 13:06:57.617 117 117 ...
- python学习(一)——python与人工智能
最近在朋友圈转起了一张图.抱着试一试的心态,我肝了些课程.都是与python相关的. 课程一:你不知道的python 讲师:王玉杰 (混沌巡洋舰联合创始人 & web ...
- angular2.x 多选框事件
angular2.x - 4.x 的多选框事件 ng2 -- ng4 反正都是用es6 都统称为2.x吧. 下面贴代码 html界面 <div class="row"> ...
- css文本(教程)
1.text-transform --文本转换 定义文本的大小写状态,此属性对中文无意义 取值:capitalize | uppercase | lowercase | none | inherit ...
- java Graphics2d消除锯齿,使字体平滑显示
Java 2D API 提供的文本处理功能进行美化.Java 2D API 的文本功能包括: 使用抗锯齿处理和微调(hinting)以达到更好的输出质量 可以使用系统安装的所有字体 可以将对图形对象的 ...
- Educational Codeforces Round 22E
给你n和k,n个数,每个数范围1e5,m次查询,每次查询区间(l,r),在区间中的每个数,如果超过k次只算k次,否则算原来的次数,求总次数,强制在线 解法:线段树维护区间中每个数经过k次到达的点pos ...
- lftp使用
lftp -c 'pget -n 5 ftp://user:password@ftpserver/test.txt' 5 线程数 安装: yum install lftp -y使用语法:lftp - ...