C#程序集系列06,程序集清单,EXE和DLL的区别
CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/
程序集清单
□ 查看程序集清单
→清空F盘as文件夹中的所有内容
→创建MainClass.cs文件
→把MainClass.cs编译成程序集
→反编译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 ) // .z\V.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..WrapNonEx63 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 ) // .z\V.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..WrapNonEx63 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 ) // .z\V.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..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: {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 MainClassextends [mscorlib]System.Object{.method private hidebysig static void Main() cil managed{.entrypoint// 代码大小 13 (0xd).maxstack 8IL_0000: nopIL_0001: ldstr "Hello World"IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: ret} // end of method MainClass::Main.method public hidebysig specialname rtspecialnameinstance 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
→反编译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 ) // .z\V.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..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.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 MainClassextends [mscorlib]System.Object{.method private hidebysig static void Main() cil managed{// 代码大小 13 (0xd).maxstack 8IL_0000: nopIL_0001: ldstr "Hello World"IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: ret} // end of method MainClass::Main.method public hidebysig specialname rtspecialnameinstance 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 资源文件 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
C#程序集系列06,程序集清单,EXE和DLL的区别的更多相关文章
- .NET配置引用程序集的路径(分离exe和dll)
按照引用程序集路径的不同,程序集DLL分为两类: 1)全局DLL(在GAC中注册,GAC——全局程序集缓存),有关GAC的详细资料可以参考一下链接: http://dddspace.com/2011/ ...
- C#程序集系列13,如何让CLR选择不同版本的程序集
本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 → ...
- C#程序集系列12,C#编译器和CLR如何找寻程序集
本篇体验C#编译器和CLR运行时如何查找程序集,并自定义CLR运行时查找程序集的方式. □ C#编译器和CLR运行时如何查找程序集 C#编译器在哪里?--在C:\Windows\Microsoft.N ...
- C#程序集系列11,全局程序集缓存
全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集.当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集. 为什么需要全局程 ...
- C#程序集系列10,强名称程序集
当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改 ...
- C#程序集系列09,程序集签名
在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程 ...
- C#程序集系列08,设置程序集版本
区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属 ...
- C#程序集系列07,篡改程序集
以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创 ...
- C#程序集系列05,让程序集包含多个module
本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 usi ...
随机推荐
- 20165203 实验二 Java面向对象程序设计
20165203 实验二 Java面向对象程序设计 一.面向对象程序设计1--单元测试和TDD 1.实验要求 参考 (http://www.cnblogs.com/rocedu/p/6371315.h ...
- CVE-2013-3893
前方高能!!!这篇博文比较长,因为我把完整的调试过程都记录下来了,感兴趣的童鞋可以看下.没有耐心的童鞋可以直接跳到最后看总结:) Microsoft Internet Explorer 远程代码执行漏 ...
- Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇
https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...
- JavaScript中的数据结构及实战系列
本系列主要是讲解JavaScript中的数据结构及在实际项目中遇到的地方 JavaScript中的数据结构及实战系列(1):队列 JavaScript中的数据结构及实战系列(2):栈
- 【LOJ】#2340. 「WC2018」州区划分
题解 学习一个全世界人都会只有我不会的东西 子集变换! 难道我要把这题当板子讲?等等这题好像是板...WC出板题好刺激啊= = 假装我们都做过HAOI2015的FMT题,我们都知道一些FMT怎么解决或 ...
- Django第一步
对于一个web框架,掌握了三部分的内容,就可以说是迈出了第一步. 1. 准备开发环境 2. 创建一个工程,并运行 3. 开发hello world应用 1. 准备环境 首先应该是安装python和dj ...
- Hadoop自定义类型处理手机上网日志
job提交源码分析 在eclipse中的写的代码如何提交作业到JobTracker中的哪?(1)在eclipse中调用的job.waitForCompletion(true)实际上执行如下方法 con ...
- 异常类Exception(String message, Throwable cause)中的cause理解
这个在构造函数里面竟然有一个Throwable,感觉有些奇怪. 1. Throwable cause 这里cause要传一个Throwable的子类异常进去么? 是引起这个异常的异常,如果这个值是空值 ...
- 不要62 hdu 2089 dfs记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...
- Java还是程序员的金饭碗
可能会存在一种更快,更简单的编程语言,但就目前来说,根据Stack Overflow的最新统计,“传统”的编程语言依然在赚着大把的钱.在2013年,招聘程序员时,搜索最多的技能关键字是Java,几乎有 ...