咱們常常在項目中引用程序集。一般狀況下,一個程序集包含一個module,但一個程序集也能夠包含多個module。本篇就來體驗:在一個能夠被編譯成.exe可執行文件的.cs文件中引用多個module。html
□ 建立第一個module
→在前面2篇文章中,F盤的as文件夾中存放了若干程序集等文件。
→打開"VS2012開發人員命令提示",輸入以下命令,最終清空了F盤的as文件夾中的全部內容
→在F盤的as文件夾中建立MyFirstModule.cs,用記事本打開編寫以下代碼,並保存
緩存
using System;
class MyFirstModule
{public static void Hello(){Console.WriteLine("來自module 1的問候~");
}}
→在"VS2012開發人員命令提示",輸入以下命令,把類編譯成module,按回車
→輸入以下命令,發現F盤的as文件夾中多了一個MyFirstModule.netmodule文件
→輸入以下命令,反編譯生成的module,把module的IL代碼放到1.txt文件中查看,按回車
→輸入以下命令,打開1.txt文件
ide
// 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 MyFirstModule.netmodule// MVID: {4403DD3C-6C5D-4AD7-AAD4-2929F36C0F4F}
.imagebase 0x10000000.file alignment 0x00000200.stackreserve 0x00100000.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x00440000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit MyFirstModuleextends [mscorlib]System.Object{.method public hidebysig static void Hello() cil managed{// 代碼大小 13 (0xd)
.maxstack 8IL_0000: nopIL_0001: ldstr bytearray (65 67 EA 81 6D 00 6F 00 64 00 75 00 6C 00 65 00 // eg..m.o.d.u.l.e.
20 00 31 00 84 76 EE 95 19 50 7E 00 ) // .1..v...P~.
IL_0006: call void [mscorlib]System.Console::WriteLine(string)IL_000b: nopIL_000c: ret} // end of method MyFirstModule::Hello
.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 MyFirstModule::.ctor
} // end of class MyFirstModule
○ .assembly extern mscorlib,說明module用到了外部的mscorlib程序集
○ .module MyFirstModule.netmodule,表示modlue的名稱是MyFirstModule.netmodule
○ .class...,表示module中的類spa
□ 建立第二個module.net
→在F盤的as文件夾中建立MySecondModule.cs,用記事本打開編寫以下代碼,並保存3d
using System;
class MySecondModule
{public static void Hello(){Console.WriteLine("來自module 2的問候~");
}}
→在"VS2012開發人員命令提示",輸入以下命令,把類編譯成module,按回車
htm
□ 引用多個moduleblog
→在F盤的as文件夾中建立MainClass.cs,用記事本打開編寫以下代碼,並保存token
using System;
class MainClass
{static void Main(){MyFirstModule.Hello();MySecondModule.Hello();}}
→輸入以下命令,編譯MainClass.cs,並引入2個module
→輸入以下命令,運行MainClass.exe
→輸入以下命令,反編譯MainClass.exe,把它的IL代碼呈現到2.txt文件中
→輸入以下命令,打開2.txt文件
ci
// Metadata version: v4.0.30319
.module extern MyFirstModule.netmodule
.module extern MySecondModule.netmodule
.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.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.
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ).hash algorithm 0x00008004.ver 0:0:0:0}.file MyFirstModule.netmodule.hash = (2F 9D 95 85 6E F4 D2 CA 50 61 C0 9F A1 58 C6 5F // /...n...Pa...X._
5D 1D 96 4B ) // ]..K
.file MySecondModule.netmodule.hash = (28 72 47 EE 2E 76 45 AA 6B 87 17 93 6B 4F 1C 5D // (rG..vE.k...kO.]
84 D8 07 CB ).module MainClass.exe// MVID: {FD4741CB-DEDE-4D91-9B95-16DAF3CEB47E}
.imagebase 0x00400000.file alignment 0x00000200.stackreserve 0x00100000.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00000001 // ILONLY
// Image base: 0x003A0000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit MainClassextends [mscorlib]System.Object{.method private hidebysig static void Main() cil managed{.entrypoint// 代碼大小 14 (0xe)
.maxstack 8IL_0000: nopIL_0001: call void [.module MyFirstModule.netmodule]MyFirstModule::Hello()
IL_0006: nopIL_0007: call void [.module MySecondModule.netmodule]MySecondModule::Hello()
IL_000c: nopIL_000d: 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
○ .module extern MyFirstModule.netmodule,引用了MyFirstModule這個module
○ .module extern MySecondModule.netmodule,引用了MySecondModule這個module
○ .assembly extern mscorlib,引用了.NET默認程序集mscorlib
○ .assembly MainClass,表明本程序集
○ .module MainClass.exe,說明MainClass自己包含了一個名稱爲MainClass.exe的module
○ .class...,表示程序集類
「C#程序集系列」包括:
參考資料:
http://www.computersciencevideos.org/ created by Jamie King