CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/
程序集清单
□ 查看程序集清单
→清空F盘as文件夹中的所有内容
→创建MainClass.cs文件
→把MainClass.cs编译成程序集
→反编译MyDll.dll,在1.txt文件中呈现
1
1ildasm /out:1.txt MyDll.dll
→打开1.txt文件
1
11.txt
1
1// Metadata version: v4.0.30319
1.assembly extern mscorlib
1{
1
2.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .zV.4..
1.ver 4:0:0:0
1}
1.assembly MyDll
1{
1.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
1
2.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
1
263 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
1.hash algorithm 0x00008004
1.ver 0:0:0:0
1}
1.module MyDll.dll
1// MVID: {7BE59AA1-0AE6-426E-B77D-5B85AB4B163F}
1.imagebase 0x10000000
1.file alignment 0x00000200
1.stackreserve 0x00100000
1
2.subsystem 0x0003 // WINDOWS_CUI
1
2
3.corflags 0x00000001 // ILONLY
1// Image base: 0x00A00000
1
1// *********** 反汇编完成 ***********************
1// 警告: 创建了 Win32 资源文件 1.res
1
1
○ .assembly extern mscorlib,不管MainClass.cs中有没有代码,一定会引用mscorlib程序集
○ .assembly MyDll语句块中的内容就是程序集清单,manifest
○ .hash algorithm 0x00008004和.ver 0:0:0:0是程序集清单中2个重要的方面
□ 查看module清单
→把MainClass.cs编译成module
1
1csc /t:module /out:MyModule.netmodule MainClass.cs
→反编译MyModule,在2.txt文件中打开
1
1ildasm /out:2.txt MyModule.netmodule
→打开2.txt文件
1
12.txt
1
1// Metadata version: v4.0.30319
1.assembly extern mscorlib
1{
1
2.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .zV.4..
1.ver 4:0:0:0
1}
1.module MyModule.netmodule
1// MVID: {17B1ABDD-85D4-42F8-AF6D-07B860FCADEC}
1.imagebase 0x10000000
1.file alignment 0x00000200
1.stackreserve 0x00100000
1
2.subsystem 0x0003 // WINDOWS_CUI
1
2
3.corflags 0x00000001 // ILONLY
1// Image base: 0x00260000
1
1
2.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
1
1
263 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
1// *********** 反汇编完成 ***********************
1
1
○ 以上只有mscorlib这个程序集的清单。
DLL和EXE的区别
→删除F盘as文件夹中除了MainClass.cs之外的所有文件
→用记事本打开MainClass.cs文件,修改如下,保存
1
1using System;
1
1class MainClass
1{
1static void Main()
1{
1Console.WriteLine("Hello World");
1}
1}
1
1
→编译MainClass.cs,生成MainClass.exe文件
1
1csc MainClass.cs
→运行MainiClass.exe
1
1MainClass.exe
→编译MainClass.cs,生成MainClass.dll文件
1
1
2csc /t:library MainClass.cs
→反编译MainClass.exe,在1.txt文件中显示
1
1ildasm /out:1.txt MainClass.exe
→打开1.txt文件
1
11.txt
1
1// Metadata version: v4.0.30319
1.assembly extern mscorlib
1{
1
2.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .zV.4..
1.ver 4:0:0:0
1}
1.assembly MainClass
1{
1.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
1
2.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
1
263 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
1.hash algorithm 0x00008004
1.ver 0:0:0:0
1}
1.module MainClass.exe
1// MVID: {1FD51DE8-5CD3-4408-AAB2-630AA5482E23}
1.imagebase 0x00400000
1.file alignment 0x00000200
1.stackreserve 0x00100000
1
2.subsystem 0x0003 // WINDOWS_CUI
1
2
3.corflags 0x00000001 // ILONLY
1// Image base: 0x003B0000
1
1
1// =============== CLASS MEMBERS DECLARATION ===================
1
1.class private auto ansi beforefieldinit MainClass
1extends [mscorlib]System.Object
1{
1
2.method private hidebysig static void Main() cil managed
1{
1.entrypoint
1
2// 代码大小 13 (0xd)
1
2.maxstack 8
1
2IL_0000: nop
1
2
3IL_0001: ldstr "Hello World"
1
2
3IL_0006: call void [mscorlib]System.Console::WriteLine(string)
1
2IL_000b: nop
1
2IL_000c: ret
1} // end of method MainClass::Main
1
1.method public hidebysig specialname rtspecialname
1
2instance void .ctor() cil managed
1{
1
2// 代码大小 7 (0x7)
1
2.maxstack 8
1
2IL_0000: ldarg.0
1
2
3IL_0001: call instance void [mscorlib]System.Object::.ctor()
1
2IL_0006: ret
1} // end of method MainClass::.ctor
1
1} // end of class MainClass
1
1
1// =============================================================
1
1// *********** 反汇编完成 ***********************
1// 警告: 创建了 Win32 资源文件 1.res
1
1
→反编译MainClass.dll,在2.txt文件中显示
1
1ildasm /out:2.txt MainClass.dll
→打开2.txt文件
1
12.txt
1
1// Metadata version: v4.0.30319
1.assembly extern mscorlib
1{
1
2.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .zV.4..
1.ver 4:0:0:0
1}
1.assembly MainClass
1{
1.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
1
2.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
1
263 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
1.hash algorithm 0x00008004
1.ver 0:0:0:0
1}
1.module MainClass.dll
1// MVID: {765C3610-5865-4A53-995C-22B24BDCAEDE}
1.imagebase 0x10000000
1.file alignment 0x00000200
1.stackreserve 0x00100000
1
2.subsystem 0x0003 // WINDOWS_CUI
1
2
3.corflags 0x00000001 // ILONLY
1// Image base: 0x00370000
1
1
1// =============== CLASS MEMBERS DECLARATION ===================
1
1.class private auto ansi beforefieldinit MainClass
1extends [mscorlib]System.Object
1{
1
2.method private hidebysig static void Main() cil managed
1{
1
2// 代码大小 13 (0xd)
1
2.maxstack 8
1
2IL_0000: nop
1
2
3IL_0001: ldstr "Hello World"
1
2
3IL_0006: call void [mscorlib]System.Console::WriteLine(string)
1
2IL_000b: nop
1
2IL_000c: ret
1} // end of method MainClass::Main
1
1.method public hidebysig specialname rtspecialname
1
2instance void .ctor() cil managed
1{
1
2// 代码大小 7 (0x7)
1
2.maxstack 8
1
2IL_0000: ldarg.0
1
2
3IL_0001: call instance void [mscorlib]System.Object::.ctor()
1
2IL_0006: ret
1} // end of method MainClass::.ctor
1
1} // end of class MainClass
1
1
1// =============================================================
1
1// *********** 反汇编完成 ***********************
1// 警告: 创建了 Win32 资源文件 2.res
1
1
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
转载于:https://www.cnblogs.com/darrenji/p/3968939.html
最后
以上就是搞怪裙子最近收集整理的关于C#程序集系列06,程序集清单,EXE和DLL的区别的全部内容,更多相关C#程序集系列06,程序集清单,EXE和DLL内容请搜索靠谱客的其他文章。
发表评论 取消回复