C#中(dotnet) :assembly和module的不同
阿新 • • 發佈:2017-07-02
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() = ( 0100 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的不同