首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多文件程序集

多文件程序集
EN

Stack Overflow用户
提问于 2013-03-10 01:48:56
回答 1查看 1.8K关注 0票数 6

在多个.cs文件中物理编码的单个文件程序集与具有多个.NetModules的多文件程序集之间有什么区别和优势?

我的教授说,这种差异可以在加载这些程序集时或在get过程中实现。不是多文件程序集的所有.Netmodules都会一次加载。但就连他也不确定。有人能给我澄清一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-10 03:29:17

假设我们有两个.cs文件,名为

RUT.cs,其中包含很少使用的类型

FUT.cs,其中包含常用类型

现在是csc /t:module RUT.cs

该行使C#编译器创建一个RUT.netmodule文件。此文件是标准DLL PE文件,但CLR本身无法加载它。

接下来,让我们将常用的类型编译到它们自己的模块中。我们将使这个模块成为程序集清单的保管者,因为这些类型经常被使用。实际上,由于此模块现在将表示整个程序集,因此我将把输出文件的名称改为JeffTypes.dll,而不是将其命名为FUT.dll:

代码语言:javascript
复制
csc /out:JeffTypes.dll /t:library /addmodule:RUT.netmodule FUT.cs

该行告诉C#编译器编译FUT.cs文件以生成JeffTypes.dll文件。由于指定了/t:library,因此将包含清单元数据表的DLL文件发送到JeffTypes.dll文件中。/addmodule:RUT.netmodule开关告诉编译器RUT.netmodule是一个应该被视为程序集一部分的文件。具体地说,/addmodule开关告诉编译器将文件添加到FileDef清单元数据表中,并将RUT.netmodule的公开导出类型添加到ExportedTypesDef清单元数据表中。

RUT.netmodule文件包含通过编译RUT.cs生成的IL代码。该文件还包含描述由RUT.cs定义的类型、方法、字段、属性、事件等的元数据表。元数据表还描述了RUT.cs引用的类型、方法等。JeffTypes.dll是一个单独的文件。与RUT.netmodule类似,此文件包含通过编译FUT.cs生成的IL代码,还包含类似的定义和引用元数据表。但是,JeffTypes.dll包含额外的清单元数据表,从而使JeffTypes.dll成为一个程序集。其他清单元数据表描述组成程序集的所有文件( JeffTypes.dll文件本身和RUT.netmodule文件)。清单元数据表还包括从JeffTypes.dll和RUT.netmodule中导出的所有公共类型

现在,如果一些引用到JeffTypes.dll的客户端代码正在执行,当第一次调用方法时,CLR会检测该方法作为参数、返回值或局部变量引用的类型。然后,CLR尝试加载包含清单的被引用程序集的文件。如果正在访问的类型在此文件中,则CLR执行其内部记账,从而允许使用该类型。如果清单指示被引用的类型在不同的文件中,则CLR尝试加载必要的文件,执行其内部记账,并允许访问该类型。仅当调用引用未加载程序集中的类型的方法时,CLR才加载程序集文件。

这意味着要运行应用程序,引用的程序集中的所有文件都不需要存在。

因此,较少使用的源类可以在NetModules中编译,并在必要时加载,从而提高性能较少的Dll文件大小,并简化更改管理和部署过程。

图片和jeffrey richter中的一些引用

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15313923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档