使用.NET开发程序的确很方便。但是对于.NET程序的运行机制却不甚了解。
    毫无疑问,Windows平台上的应用程序都是要调用WindowsAPI的,能让指挥系统干活的只能是Windows的API。
    那么一个.NET的应用程序是如何加载windows的dll(kernel32.dll,user32.dll,gdi32.dll等),是如何调用API的呢?
    貌似中间还有个.NET的虚拟机在工作,那应用程序如何和虚拟机交互,又通过什么样的方式调用API这个我很好奇。
    希望牛人们能帮我解答,如果有这方面的资料,就谢谢大家了。

解决方案 »

  1.   

    所有.net程序从编写到最后以机器码在电脑上运行都要经过两次编译。
    第一次编译时,.net下的代码都被编译成il和metadata,放在dll中,而这种dll在运行时需要jit的二次编译才能转化为机器码运行。
      

  2.   

    MSIL看了就明白了,深入java虚拟机一个道理和.NET虚拟机深入的看一下就理解了。
    C#调用本地方法和WinAPI
      

  3.   

    给你几个关键字 去搜索一下会知道很多 IL  FrameWork 元数据
      

  4.   

        看了网上的一些资料,但是我希望知道更具体的内容:
         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的?
      

  5.   

        就俺这种菜鸟,没戏~等下辈子我转世投胎,IQ400吧,貌似400还不怎么够,IQ4000差不多了(怎么觉得就像一个ET一样,脑袋特大!~)
        扯远了,因为想实现.NET程序的API拦截,所以跑来问问。