.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程序如何运行?

时间: 2024-08-26 03:00:43

.NET程序如何启动?的相关文章

walker代理深入浅出——程序的启动原理(下)(探究 UIWindow)

上一节主要讲解了程序的启动原理UIApplication 的启动,以及 main 函数的执行,现在主要讲解界面的加载以及执行部分. UIWindow 下面先看看Apple的官方文档 Apple官方文档 UIWindow继承自UIView,UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面.即使有多个UIWindow对象,也只有一个UIWindow可以接受到用户的触屏事件(即主窗口). iOS程序启动完毕后,先

解决Pyqt打包后运行报错:应用程序无法启动 因为程序的并行配置不正确

做了一个生成二维码的小程序:http://www.cnblogs.com/dcb3688/p/4241048.html 直接运行脚本没问题,用pyinstaller打包后再运行就直接报错了: 应用程序无法启动 因为程序的并行配置不正确.有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具. 网上找的解决方法: 1.   安装Microsoft Visual C++ 2008 Redistributable 2.  开始 - 运行(输入services.msc)- 确

关于并行配置不正确,应用程序无法启动的问题

这二天的一个软件发布后,在自己的电脑与测试电脑上和虚拟机上运行都没有问题,当弄了一台新电脑,准备安装好软件,给客户用时,出现"应用程序无法启动,应用程序的并行配置不正确". 这回有点傻了,这个错误都没见过,在说,我程序编译时用的是静态库编译,如果没有库,也会报缺少**.DLL库啊,报个这个错,有点看不懂的感觉,其它的运行时库用的是多线程DLL(/MD)而不是多线程(/MT),因为用的是VC与C#混合编程,需要用到公共语言运行库(/CLR),没办法,找万能的狗哥,网页上大家都说是因为系统

一个应用程序无法启动错误的解决过程

作者:朱金灿 来源:http://blog.csdn.net/clever101 早上同事向我请教一个问题,说是启动exe时遇到一个应用程序无法启动的错误,具体例如以下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" align="middle" /> 我让他打开"控制

打开某exe提示"应用程序无法启动,因为应用程序的并行配置不正确……"的解决方案

本人在新安装好了的windows server 2008 r2 (64位)上运行"RefilesName V2.0(文件批量改名).exe",结果提示: 应用程序无法启动,因为应用程序的并行配置不正确.有关详细信息,请参阅应用程序事件日志,或使用命令行 sxstrace.exe 工具. 开始安装了64位的VC++ 2010.2015等,但仍未解决.最后安装了32位的VC++ 2005,问题解决. Microsoft Visual C++ 2005 SP1 Redistributable

allegro 有找到cmlib.dll,因此这个应用程序未能启动

运行allegro.exe,没有找到cmlib.dll,因此这个应用程序未能启动.重新安装应用程序可能会修复此总问题. 按照网上的方法: 如果运行Capture.exe找不到cdn_sfl401as.dll,如果运行allegro.exe找不到cnlib.dll,(上面俩个库文件都在C:/Cadence/SPB_16.3/tools/bin中),请检查环境变量设置是否完整!我遇到上述问题,发现没有CDSROOT的定义,添加一个:                  变量名:CDSROOT    

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

Atitit. Gui控件and面板----程序快速启动区--最佳实践Launchy ObjectDock-o0g

Atitit.  Gui控件and面板----程序快速启动区--最佳实践Launchy ObjectDock-o0g 两个方式::: 键盘式::先用热键呼叫出QS,然后开始输入程序中的部分字母,按Enter就 是启动这个程序 鼠标式::mouse左的呼叫出面板,分组,点击启动... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[email protected] 转载请注明来源: http://blog.csdn.net/attilax 1. ===Launchy Quicksil

【VC编程技巧】窗体?3.5对单文档或者多文档程序制作启动画面

(一)概要: 文章描述了怎样通过Visual C++ 2012或者Visual C++ .NET,为单文档或者多文档程序制作启动画面.在Microsoft Visual Studio 6.0中对于单文档程序(SDI)我们可以很方便利用微软提供的组件Visual C++ Component (Splash Screen).因为在Microsoft Visual Studio 6.0以后的版本或者Visual C++ .NET没有提供这个组件,我们可以通过自定义对话框来实现Splash Screen