.net应用程序启动时会发生什么
本文关键字:什么 应用程序 启动 net | 更新日期: 2023-09-27 18:01:30
我使用。net开发应用程序已经有一段时间了。但是,我仍然没有当然,CLR如何知道。net应用程序已经启动。每个应用程序都有一个CLR实例吗?我不认为这是可能的情况,因为只有一个GC管理所有。net应用程序的所有内存。CLR是在后台运行吗?
嗯,让我也试一下。
-
有人用c#或。net"中间语言"或其他托管语言构建。net应用程序。
-
该语言的编译器csc.exe (c#),或ilasm.exe(字节码汇编器),或任何产生PE可执行文件的编译器。PE可执行文件具有编译器或汇编器填充的特定结构。包括:
- 是入口点,
- 它使用的动态库列表(IMPORT表)。其中一个库是mscoree.dll 大量的元数据,包括目标的。net运行时版本
-
当可执行文件被点击,从命令行运行,或从Win32 API执行时,Windows加载器实现(在NTDLL.dll中)接管
-
加载器代码负责将可执行文件放入内存,在需要时加载动态链接库,将链接库映射到可执行代码可以访问的位置,并使用映射库的实际地址更新Import Address Table。
-
一旦一切准备就绪,加载程序跳转到入口点(我认为这是通过一些诡计从内核空间切换到用户空间,或者切换到保护模式,因为应用程序运行在它自己受保护的32位或64位内存空间中)。入口点指向mscoree.dll——. net公共对象运行时执行引擎,它刚刚被映射到进程内存中。我见过这个DLL被称为。net启动插件,它允许。net的多个安装存在于一台机器上。Mscoree.dll是你在自己的常规应用程序中嵌入。net语言时要使用的库。
-
Mscoree.dll查看从PE可执行文件加载的元数据,特别是CLR头,以及目标的。net运行时版本。从它可以CorBindToRuntimeEx2到正确的CLR版本。
-
CorBindToRuntimeEx加载正确的。net运行时实现(并返回一个指向COM接口的指针,允许您调用。net运行时)。这段代码是从%WINDIR%'Microsoft.NET'Framework'v#####中的dll中加载的。
-
我不确定谁在这一点上,但可能是mscoree shim使用。net ICLRRuntimeHost接口指针来调用方法来初始化。net运行时,垃圾收集器,IL解释器,JIT和IHostControl接口(允许。net解释器与托管进程对话),并最终告诉解释器开始执行编译后的应用程序的IL代码。
(写这篇文章我学到了很多——链接后面有大量的信息,我当然没有把它们都看完!)
http://msdn.microsoft.com/en-us/library/xh0859k0.aspx http://my.safaribooksonline.com/book/programming/microsoft-dotnet/0735619883/a-tour-of-the-clr-hosting-api/ch02lev1sec3 http://msdn.microsoft.com/en-us/magazine/bb985994.aspxWindows可执行文件是可移植可执行文件,一种向Windows提供加载和运行程序所需信息的格式。当Windows遇到。net程序时,它会加载CLR的一个实例,并将程序的执行交给新的CLR实例。每个正在运行的。net程序都托管在它自己的CLR实例中。
CLR进程加载IL程序并将其编译为本机代码(JIT),然后执行该代码,负责该程序的内存管理和垃圾收集。