使用.NET开发程序的确很方便。但是对于.NET程序的运行机制却不甚了解。
毫无疑问,Windows平台上的应用程序都是要调用WindowsAPI的,能让指挥系统干活的只能是Windows的API。
那么一个.NET的应用程序是如何加载windows的dll(kernel32.dll,user32.dll,gdi32.dll等),是如何调用API的呢?
貌似中间还有个.NET的虚拟机在工作,那应用程序如何和虚拟机交互,又通过什么样的方式调用API这个我很好奇。
希望牛人们能帮我解答,如果有这方面的资料,就谢谢大家了。
毫无疑问,Windows平台上的应用程序都是要调用WindowsAPI的,能让指挥系统干活的只能是Windows的API。
那么一个.NET的应用程序是如何加载windows的dll(kernel32.dll,user32.dll,gdi32.dll等),是如何调用API的呢?
貌似中间还有个.NET的虚拟机在工作,那应用程序如何和虚拟机交互,又通过什么样的方式调用API这个我很好奇。
希望牛人们能帮我解答,如果有这方面的资料,就谢谢大家了。
第一次编译时,.net下的代码都被编译成il和metadata,放在dll中,而这种dll在运行时需要jit的二次编译才能转化为机器码运行。
C#调用本地方法和WinAPI
1. CLR是以什么形式在于系统中的?系统服务的形式么?
2. 内存中的.NET程序被加载到内存后,应该还不会被CLR解释,只有到CPU开始执行这个段代码的时候,才开始解释IL的吧,那程序是如何通过JIT编译器解释的。是将JIT编译器加载到应用程序内部进行编译,还是将IL发送到JIT所在的服务(如果不是服务的话,至少应该有个进程在吧?)?
3. 如果是把IL发送到别的进程进行解释,那么解释后的机器代码是如何返回给.NET程序的?
4. 得到返回后的机器代码,.NET是通过动态加载的方式将(Kernerl32.dll,User32.dll,Gdi32.dll)等DLL加载到自己的程序空间中再调用API(总觉得这样好慢),还是以别的手段来调用API的?
扯远了,因为想实现.NET程序的API拦截,所以跑来问问。