我是靠谱客的博主 搞怪裙子,最近开发中收集的这篇文章主要介绍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

转载于:https://www.cnblogs.com/darrenji/p/3968939.html

最后

以上就是搞怪裙子为你收集整理的C#程序集系列06,程序集清单,EXE和DLL的区别的全部内容,希望文章能够帮你解决C#程序集系列06,程序集清单,EXE和DLL的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部