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

编译成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#编写,可以把这两个模块包括在一个程序集中

时间: 2024-09-30 07:20:47

C#中(dotnet) :assembly和module的不同的相关文章

node.js中的exports和module.exports

不同的编程语言都有各自的代码组织和复用的方式,如.net.php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染.一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式. 首先怎么创建node中的modules. 可以直接创建一个文件作为module,如下module.js function writeLine(){ console.log("module.js"); } export

3.React Native在Android中自定义Component和Module

React Native最终展示的UI全是Native的UI,将Native的信息封装成React方便的调用.那么Native是如何封装成React调用的?Native和React是如何交互的? ViewManager UI组件:将Native的UI暴露出来供JS调用. Native组件封装成JS组件供JS调用.这里的一个问题是怎么将Native中的属性用在JS中,以及属性可以有哪些类型的?可以先思考一下. 下面Native的代码自定义了一个View并定义了一个变化的属性color. publi

【转+补充】在OpenCV for Android 2.4.5中使用SURF(nonfree module)

1.各种环境配置可以参考:http://blog.csdn.net/ruifdu/article/details/9120559 2.在Guohui的blog看到更详细的描述和例程.针对2.4.8版本的opencv,上文环境配置有个问题,需要注意,不然编译libnonfree.so会出错: 1)android.mk配置中,csdn上最后一段配置“LOCAL_SRC_FILES := nonfree_init.cpp \ precomp.cpp \ sift.cpp \ surf.cpp”,要把p

IntelliJ系列IDE中的project和module

使用基于IntelliJ的IDE,如phpstorm.android studio都会对project和module的关系比较糊涂.用简单的一句话来概括是:IntelliJ系中的Project相当于Eclipse系中的workspace.IntelliJ系中的Module相当于Eclipse系中的Project. IntelliJ中一个Project可以包括多个ModuleEclipse中一个Workspace可以包括多个Project phpstorm中似乎在弱化Module的存在,把File

Android Studio中关于Project与Module

在Android Studio中一个Project和Eclipse中的WorkSpace是相似的,而一个Module与Eclipse中的Project是相似的(大致可以这么的认为) 若在Android Studio中的一个Project(工作空间)中Import/New  1:N个Module,单个的Module直接在运行的时候选择合适的Module则会运行那个项目: 若在同一个Project中调用多个Module,需要在主Module(姑且这么认识他,作为启动的Module,默认是app目录下

linux7中python ImportError: No module named pymc 处理

linux7中python ImportError: No module named pymc 处理方法 系统环境 #cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) #python -V Python 2.7.5 pip安装pymc报错#报错内容如下:error: lapack/double/dpotrs.f: No such file or directory 解决方法(1)最简单的方式--pip #从上面报错内容可知,

Dump内存中的Assembly到磁盘

发现ConfuserEx这个开源的.NET加密程序用的人也非常多,尤其是老外.屡屡遇到这东西,很头疼,主要是是没有现成的脱壳程序,需要手动脱壳,虽说难度不大,但它更新的速度挺快,一直在变化,总是给人一种追着才能赶上的感觉,真是不爽.话说来,不知国内是真没有大牛,还是大牛都藏着掖着,那些脱壳的程序都是老外的作品,身在天朝又访问不了GG,只能自己动手了.其实本文的目的是根据内存中的源程序集Rebuild一个新的程序集,之所以不是Dump是因为还要把被混淆过的名称和字符串信息还原,显然Dump不能满足

【前端学习笔记】2015-09-09~~~~nodejs中的require()和module.exports

nodejs中一个js文件就可以看做是一个模块 在node环境中,可以直接var a=require('模块路径以及不带扩展名的模块名') exports---module.exports 其中node准备好了module变量, var module={ id:'hello', exports:{} }; 输出模块变量,最好都用module.exports=''或者函数;当赋值不是函数或者数组时,可以对exports直接赋值,建议统一使用module.exports=进行赋值

AngularJS中的模块(module)

AngularJS中的module 大部分应用都有一个主方法(main)来实例化.组织.启动应用.AngularJS中没有主方法,而是使用模块来声明应用该如何启动.模块允许通过声明的方式来描述应用中的依赖关系,以及如何组装和启动. 一个模块可以引入另一个模块.在一个模块中定义多个服务,当引入这个模块时,就可以使用这个模块中的一个或者多个服务. AngularJS本身的一个默认模块叫ng,ng模块提供了$scope,$http等服务.服务只是模块提供的多种机制中的一种,其它的还有指令(direct