• C#程序集系列06,程序集清单,EXE和DLL的区别


    CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/

      程序集清单

    □ 查看程序集清单

    →清空F盘as文件夹中的所有内容
    →创建MainClass.cs文件
    →把MainClass.cs编译成程序集
    37
    →反编译MyDll.dll,在1.txt文件中呈现

    ildasm /out:1.txt MyDll.dll

    →打开1.txt文件
    1.txt

     

    // Metadata version: v4.0.30319
    
    .assembly extern mscorlib
    
    {
    
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4..
    
      .ver 4:0:0:0
    
    }
    
    .assembly MyDll
    
    {
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
    
                                                                                                                 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
    
      .hash algorithm 0x00008004
    
      .ver 0:0:0:0
    
    }
    
    .module MyDll.dll
    
    // MVID: {7BE59AA1-0AE6-426E-B77D-5B85AB4B163F}
    
    .imagebase 0x10000000
    
    .file alignment 0x00000200
    
    .stackreserve 0x00100000
    
    .subsystem 0x0003       // WINDOWS_CUI
    
    .corflags 0x00000001    //  ILONLY
    
    // Image base: 0x00A00000
    
    // *********** 反汇编完成 ***********************
    
    // 警告: 创建了 Win32 资源文件 1.res
    

    ○ .assembly extern mscorlib,不管MainClass.cs中有没有代码,一定会引用mscorlib程序集
    ○ .assembly MyDll语句块中的内容就是程序集清单,manifest
    ○ .hash algorithm 0x00008004和.ver 0:0:0:0是程序集清单中2个重要的方面


    □ 查看module清单

    →把MainClass.cs编译成module

    csc /t:module /out:MyModule.netmodule MainClass.cs

    →反编译MyModule,在2.txt文件中打开

    ildasm /out:2.txt MyModule.netmodule

    →打开2.txt文件

    2.txt
    // Metadata version: v4.0.30319
    
    .assembly extern mscorlib
    
    {
    
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4..
    
      .ver 4:0:0:0
    
    }
    
    .module MyModule.netmodule
    
    // MVID: {17B1ABDD-85D4-42F8-AF6D-07B860FCADEC}
    
    .imagebase 0x10000000
    
    .file alignment 0x00000200
    
    .stackreserve 0x00100000
    
    .subsystem 0x0003       // WINDOWS_CUI
    
    .corflags 0x00000001    //  ILONLY
    
    // Image base: 0x00260000
    
    .custom ([mscorlib]System.Runtime.CompilerServices.AssemblyAttributesGoHere) instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
    
    63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
    
    // *********** 反汇编完成 ***********************
    

    ○ 以上只有mscorlib这个程序集的清单。

      DLL和EXE的区别

    →删除F盘as文件夹中除了MainClass.cs之外的所有文件
    →用记事本打开MainClass.cs文件,修改如下,保存

    using System;
    
    class MainClass
    
    {
    
        static void Main()
    
        {
    
            Console.WriteLine("Hello World");
    
        }
    
    }
    

    →编译MainClass.cs,生成MainClass.exe文件

    csc MainClass.cs

    →运行MainiClass.exe
    MainClass.exe

    →编译MainClass.cs,生成MainClass.dll文件
    csc  /t:library MainClass.cs

    →反编译MainClass.exe,在1.txt文件中显示
    ildasm /out:1.txt MainClass.exe

    →打开1.txt文件
    1.txt

     

    // Metadata version: v4.0.30319
    
    .assembly extern mscorlib
    
    {
    
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4..
    
      .ver 4:0:0:0
    
    }
    
    .assembly MainClass
    
    {
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
    
                                                                                                                 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
    
      .hash algorithm 0x00008004
    
      .ver 0:0:0:0
    
    }
    
    .module MainClass.exe
    
    // MVID: {1FD51DE8-5CD3-4408-AAB2-630AA5482E23}
    
    .imagebase 0x00400000
    
    .file alignment 0x00000200
    
    .stackreserve 0x00100000
    
    .subsystem 0x0003       // WINDOWS_CUI
    
    .corflags 0x00000001    //  ILONLY
    
    // Image base: 0x003B0000
    
    // =============== CLASS MEMBERS DECLARATION ===================
    
    .class private auto ansi beforefieldinit MainClass
    
           extends [mscorlib]System.Object
    
    {
    
      .method private hidebysig static void  Main() cil managed
    
      {
    
        .entrypoint
    
        // 代码大小       13 (0xd)
    
        .maxstack  8
    
        IL_0000:  nop
    
        IL_0001:  ldstr      "Hello World"
    
        IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    
        IL_000b:  nop
    
        IL_000c:  ret
    
      } // end of method MainClass::Main
    
      .method public hidebysig specialname rtspecialname 
    
              instance void  .ctor() cil managed
    
      {
    
        // 代码大小       7 (0x7)
    
        .maxstack  8
    
        IL_0000:  ldarg.0
    
        IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    
        IL_0006:  ret
    
      } // end of method MainClass::.ctor
    
    } // end of class MainClass
    
    // =============================================================
    
    // *********** 反汇编完成 ***********************
    
    // 警告: 创建了 Win32 资源文件 1.res
    

    →反编译MainClass.dll,在2.txt文件中显示
    ildasm /out:2.txt MainClass.dll

    →打开2.txt文件
    2.txt

     

    // Metadata version: v4.0.30319
    
    .assembly extern mscorlib
    
    {
    
      .publickeytoken = (B7 7A 5C 56 19 34 E0 89 )                         // .zV.4..
    
      .ver 4:0:0:0
    
    }
    
    .assembly MainClass
    
    {
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) 
    
      .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78   // ....T..WrapNonEx
    
                                                                                                                 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 )       // ceptionThrows.
    
      .hash algorithm 0x00008004
    
      .ver 0:0:0:0
    
    }
    
    .module MainClass.dll
    
    // MVID: {765C3610-5865-4A53-995C-22B24BDCAEDE}
    
    .imagebase 0x10000000
    
    .file alignment 0x00000200
    
    .stackreserve 0x00100000
    
    .subsystem 0x0003       // WINDOWS_CUI
    
    .corflags 0x00000001    //  ILONLY
    
    // Image base: 0x00370000
    
    // =============== CLASS MEMBERS DECLARATION ===================
    
    .class private auto ansi beforefieldinit MainClass
    
           extends [mscorlib]System.Object
    
    {
    
      .method private hidebysig static void  Main() cil managed
    
      {
    
        // 代码大小       13 (0xd)
    
        .maxstack  8
    
        IL_0000:  nop
    
        IL_0001:  ldstr      "Hello World"
    
        IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
    
        IL_000b:  nop
    
        IL_000c:  ret
    
      } // end of method MainClass::Main
    
      .method public hidebysig specialname rtspecialname 
    
              instance void  .ctor() cil managed
    
      {
    
        // 代码大小       7 (0x7)
    
        .maxstack  8
    
        IL_0000:  ldarg.0
    
        IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
    
        IL_0006:  ret
    
      } // end of method MainClass::.ctor
    
    } // end of class MainClass
    
    // =============================================================
    
    // *********** 反汇编完成 ***********************
    
    // 警告: 创建了 Win32 资源文件 2.res
    

     

    MainClass.exe和MainClass.dll在IL上的不同体现在:
    ○ EXE有程序的入口店.entrypoint,而DLL没有
    ○ EXE的modlue名称为MainClass.exe,DLL的module名称为MainClass.dll

    “C#程序集系列”包括:

      C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序

      C#程序集系列02,使用记事本查看可执行程序集的IL代码

      C#程序集系列03,引用多个module

      C#程序集系列04,在程序集包含多个module的场景下理解关键字internal

      C#程序集系列05,让程序集包含多个module

      C#程序集系列06,程序集清单,EXE和DLL的区别

      C#程序集系列07,篡改程序集

      C#程序集系列08,设置程序集版本

      C#程序集系列09,程序集签名

      C#程序集系列10,强名称程序集

      C#程序集系列11,全局程序集缓存

      C#程序集系列12,C#编译器和CLR如何找寻程序集

      C#程序集系列13,如何让CLR选择不同版本的程序集

    参考资料:

    http://www.computersciencevideos.org/  created by Jamie King

  • 相关阅读:
    JFinal框架
    shiro认证登录实现
    linux常用的命令
    zookeeper部署到linux操作步骤
    java的冒泡排序
    软件设计的七大原则
    vue知识点整理
    JVM垃圾回收算法
    Sql Server删库了怎么办?跑路是不可能跑路的
    Linux--find用法
  • 原文地址:https://www.cnblogs.com/darrenji/p/3968939.html
Copyright © 2020-2023  润新知