1. 程式人生 > >C#中(dotnet) :assembly和module的不同

C#中(dotnet) :assembly和module的不同

compile mod 啟動 demo version db2 services sub void

編譯成module和assembly後的IL有什麽不同

同一個代碼編譯成不同的文件後通過反編譯為IL結果如下

編譯成netmodule時:

Manifest文件:
// 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: {DB53EC74-CABD-4430-8651-980A2322AD17}
.imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // Image base: 0x074B0000 MetaInfo開頭: ScopeName : MyModule.netmodule MVID : {DB53EC74-CABD-4430-8651-980A2322AD17}

編譯成assembly時:

Manifest文件:
// 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 MyAssembly { .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 MyAssembly.exe // MVID: {CDB21366-6AC7-4748-B06A-1B05A6391118} .imagebase 0x00400000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // Image base: 0x074B0000 MetaInfo開頭: ScopeName : MyAssembly.exe MVID : {CDB21366-6AC7-4748-B06A-1B05A6391118}

將已有模塊添加到程序集中時:

將模塊MyModule.netmodule加入到新建的程序集中:

編譯命令:csc /target:library /addmodule:MyModule.netmodule /out:LibraryAddedModule.dll

反編譯後查看結果:

Manifest內容:
// 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 LibraryAddedModule
{
  .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.
  .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 MyModule.netmodule
    .hash = (6E B4 3E 07 6D 21 3A 22 76 56 17 19 1B EB 66 D4   // n.>.m!:"vV....f.
             E6 5B B9 E8 )                                     // .[..
.class extern public ProcessDomain.Demo
{
  .file MyModule.netmodule
  .class 0x02000003
}
.class extern public ProcessDomain.Class1
{
  .file MyModule.netmodule
  .class 0x02000004
}
.class extern public ProcessDomain.ClassStatic
{
  .file MyModule.netmodule
  .class 0x02000005
}
.module LibraryAddedModule.dll
// MVID: {FCAFC9D8-E015-472C-AEAA-E6446901A0F7}
.imagebase 0x10000000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x087F0000

MetaInfo開頭:
ScopeName : LibraryAddedModule.dll
MVID      : {FCAFC9D8-E015-472C-AEAA-E6446901A0F7}

至於不同之處:

程序集比模塊,多了.assembly部分,如果程序集包括了已經編譯好的模塊,好會有對引用模塊的描述部分.file 和.class extern public

程序集可以由多個模塊組成,模塊的作用:

1 模塊可以更快的啟動程序集,因為並不是所有的類型都在一個文件中,模塊只在需要的時候加載。

2 需要多種語言來創建一個程序集時,一個模塊可以用vb編寫,另一個模塊用C#編寫,可以把這兩個模塊包括在一個程序集中

C#中(dotnet) :assembly和module的不同