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..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 )                         // .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..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 )                         // .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..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 )                         // .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..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的区别

参考资料:

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

时间: 2024-08-03 22:18:11

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

.NET配置引用程序集的路径(分离exe和dll)

按照引用程序集路径的不同,程序集DLL分为两类: 1)全局DLL(在GAC中注册,GAC——全局程序集缓存),有关GAC的详细资料可以参考一下链接: http://dddspace.com/2011/01/gac.html http://baike.baidu.com/view/405773.htm http://www.cnblogs.com/chenlulouis/archive/2010/06/30/1768176.html 2)私有DLL,默认情况下,添加程序集引用的时候,程序集DLL会

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

本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 →查看Cow.cs文件 using System; using System.Reflection; [assembly: AssemblyVersion("3.3.3.3")] public class Cow { public static void Moo() { Console.Wr

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

在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程序集所在文件夹创建密匙→打印密匙密匙是一堆乱码,这是经过加密了.→在密匙的基础上创建公匙Public Key→打印公匙Public Key注意:这里的public token是public key经过哈希算法而获得的.当程序集被引用,该程序集对外是以public token形式存在的. →现在重新编译&quo

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

区别一个程序集,不仅仅是程序集名称,还包括程序集版本.程序集公匙.程序集文化等,本篇体验通过界面和编码设置程序集版本. □ 通过Visual Studio设置程序集版本 →右键项目,选择"属性",选择"应用程序"→点击"程序集信息",设置如下,点击确定→点击项目Properties文件夹下的AssemblyInfo.cs,可以看到程序集版本已经设置生效[assembly: AssemblyVersion("3.3.3.3")]

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

以下几个方面用来区分不同的程序集:○ 程序集名称:Name○ 程序集版本:Version○ 程序集公匙: Public Token○ 程序集文化:Culture 如果没有很严格地按照上面的几个方面来创建程序集,程序集是很容易被篡改的.本篇体验篡改程序集. →清空F盘as文件夹下的所有文件→在as文件夹下创建Dog.cs类,用记事本打开,编写如下,保存 using System; public class Dog { public static void MakeSound() { Console

设置程序PrivatePath,配置引用程序集的路径(分离exe和dll)

原文:设置程序PrivatePath,配置引用程序集的路径(分离exe和dll) 有时候我们想让程序的exe文件和dll文件分开在不同目录,这时候可以有3种方法 1.在app.config中配置 [html]?view plain?copy <runtime>?? ????<gcConcurrent?enabled="true"?/>?? ????<assemblyBinding?xmlns="urn:schemas-microsoft-com:

MIFARE系列8——D8M1.exe

软件名:D8M1.exe 更新时间:2014.06.28 操作系统:windowAll 外部设备:D8读卡器 D8M1可以对MIFARE块读写操作,支持1K,4K.检验KEY后返回SAK,QTAQ,UID.基于D8读卡器提供的dcrf32.dll开发. D8型IC卡读写器是开发IC卡相关产品及系统集成必备的前端处理设备,可读写双界面射频智能卡或单独的非接触式射频卡,通过RS232串行接口或USB口实现同PC机及相关设备的连接,USB采用无驱技术,可方便用户的安装使用,它对多卡的支持可用于安全发卡

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

当一个程序集的名称,版本,文化,Public Key都做了设置,就可以把这个程序集叫做"强名称程序集".强名称程序集可以防止被仿冒或篡改.本篇首先创建一个强名称程序集,接着模拟篡改程序集,看看最终结果如何? □ 创建一个强名称程序集 →在"C#程序集系列08,设置程序集版本"和"C#程序集系列09,程序集签名"中,在F盘的as文件夹中创建了一些文件→删除所有除了.cs类型的所有文件→创建一个密匙→编译Cow.cs,并用密匙签名→编译MainCla

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

本篇体验在一个程序集中包含多个module. □ 创建3个module →删除F盘as文件夹中的一些文件,只剩下如下3个文件→用记事本打开MyFirstModule.cs文件,修改如下,并保存 using System; public class MyFirstModule { public static void Hello() { Console.WriteLine("来自module 1的问候~"); } } →用记事本打开MySecondModule.cs文件,修改如下,并保存