继续上一篇"C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序",在F盘的as文件夹中已经有了若干程序集。本篇体验使用记事本查看可执行程序集的IL代码。
→打开"VS2012开发人员命令提示",输入如下命令,并按回车
在as文件夹中多了1.txt和1.res这2个文件
→输入如下命令打开1.txt
// Microsoft (R) .NET Framework IL Disassembler. Version 4.0.30319.18020
// 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 extern MyClass
{.ver 0: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..WrapNonEx63 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: {73BA142E-F5C9-4C2E-8963-DB7213CB466A}
.imagebase 0x00400000.file alignment 0x00000200.stackreserve 0x00100000.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00560000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit MainClassextends [mscorlib]System.Object{.method private hidebysig static void Main() cil managed{.entrypoint// 代码大小 8 (0x8)
.maxstack 8IL_0000: nopIL_0001: call void [MyClass]MyClass::PrintSth()
IL_0006: nopIL_0007: ret} // end of method MainClass::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{// 代码大小 7 (0x7)
.maxstack 8IL_0000: ldarg.0IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret} // end of method MainClass::.ctor
} // end of class MainClass
// =============================================================
// *********** 反汇编完成 ***********************
// 警告: 创建了 Win32 资源文件 1.res
以上,
○ .assembly extern mscorlib,表示在CLR运行时需要引用mscorlib这个.NET默认程序集
○ .assembly extern MyClass,表示在CLR运行时需要引用MyClass这个自定义程序集
○ .assembly MainClass语句块,包含了MainClass这个程序集的Manifest清单
○ .module MainClass.exe,表示MainClass这个程序集有一个module,名称是MainClass.exe,当然一个程序集可以包含多个module
“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