zoukankan      html  css  js  c++  java
  • donet编译原理(C#)

    1、简单的C#代码如下
    using System;
    class HelloWorld
    {
      public static void Main()
      {
       Console.WriteLine("Hello World !");
      }
    }
    2、编译代码 Csc HelloWorld.cs
    3、ildasm /output: helloworld.il hellworld.exe
       执行后的生成的helloworld.il代码如下:
       
    //  Microsoft (R) .NET Framework IL Disassembler.  Version 1.1.4322.573
    //  Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

    .assembly extern mscorlib
    {
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .z\V.4..
      .ver 1:0:5000:0
    }
    .assembly hello
    {
      // --- 下列自定义属性会自动添加,不要取消注释 -------
      //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,
      //                                                                                bool) = ( 01 00 00 01 00 00 )
      .hash algorithm 0x00008004
      .ver 0:0:0:0
    }
    .module hello.exe
    // MVID: {88322604-DD05-427D-B4E1-5400E019D7D3}
    .imagebase 0x00400000
    .subsystem 0x00000003
    .file alignment 512
    .corflags 0x00000001
    // Image base: 0x06ce0000
    //
    // ============== CLASS STRUCTURE DECLARATION ==================
    //
    .class private auto ansi beforefieldinit HelloWorld
           extends [mscorlib]System.Object
    {
    } // end of class HelloWorld


    // =============================================================


    // =============== GLOBAL FIELDS AND METHODS ===================


    // =============================================================


    // =============== CLASS MEMBERS DECLARATION ===================
    //   note that class flags, 'extends' and 'implements' clauses
    //          are provided here for information only

    .class private auto ansi beforefieldinit HelloWorld
           extends [mscorlib]System.Object
    {
      .method public hidebysig static void  Main() cil managed
      {
        .entrypoint
        // 代码大小       11 (0xb)
        .maxstack  1
        IL_0000:  ldstr      "Hello World !"
        IL_0005:  call       void [mscorlib]System.Console::WriteLine(string)
        IL_000a:  ret
      } // end of method HelloWorld::Main

      .method public hidebysig specialname rtspecialname
              instance void  .ctor() cil managed
      {
        // 代码大小       7 (0x7)
        .maxstack  1
        IL_0000:  ldarg.0
        IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
        IL_0006:  ret
      } // end of method HelloWorld::.ctor

    } // end of class HelloWorld


    // =============================================================

    //*********** 反汇编完成 ***********************
    // WARNING: Created Win32 resource file hello.res

    4、小结
       们粗略的感受是它很类似于早先的汇编语言,但它具有了对象定义和操作的功能。我们可以看到它定义并实现了一个继承自System.Object 的HelloWorld类及两个函数:Main()和.ctor()。其中.ctor()是HelloWorld类的构造函数,可在"HelloWorld.cs"源代码中我们并没有定义构造函数呀--是的,我们没有定义构造函数,但C#的编译器为我们添加了它。你还可以看到C#编译器也强制HelloWorld类继承System.Object类,虽然这个我们也没有指定。关于这些高级话题我们将在以后的讲座中予以剖析。

    那么PE文件是怎么执行的呢?下面是一个典型的C#/.NET应用程序的执行过程:

    1.
     用户执行编译器输出的应用程序(PE文件),操作系统载入PE文件,以及其他的DLL(.NET动态连接库)。
     
    2.
     操作系统装载器根据前面PE文件中的可执行文件头跳转到程序的入口点。显然,操作系统并不能执行中间语言,该入口点也被设计为跳转到mscoree.dll(.NET平台的核心支持DLL)的_ CorExeMain()函数入口。
     
    3.
     CorExeMain()函数开始执行PE文件中的中间语言代码。这里的执行的意思是通用语言运行时按照调用的对象方法为单位,用即时编译器将中间语言编译成本地机二进制代码,执行并根据需要存于机器缓存。
     
    4.
     程序的执行过程中,垃圾收集器负责内存的分配,释放等管理功能。
     
    5.
     程序执行完毕,操作系统卸载应用程序。


    声明:参考著作《.NET框架程序设计(修订版) 》.李建忠
     



     

  • 相关阅读:
    详细聊聊k8s deployment的滚动更新(一)
    更新k8s镜像版本的三种方式
    深入理解docker信号机制以及dumb-init的使用
    10分钟教你理解反射
    nodejs的交互式解释器模式常用命令
    nrm的安装和使用
    复杂sql语句之单字段分类count计数和多字段count计数
    navicat连接mysql出现2059
    mongodb常规操作语句
    System.Web.NullPointerException
  • 原文地址:https://www.cnblogs.com/kuailewangzi1212/p/658313.html
Copyright © 2011-2022 走看看