关于c#:. NET Module vs Assembly

.NET Module vs Assembly

我一直在试图用"正确"的答案来回答这个问题?StackOverflow中有几个主题涵盖了这一点,但与msdn文档有些冲突。

例如,请注意他问题的第二个答案中的图表:什么是托管模块(与程序集相比)?

现在查看msdn图:http://msdn.microsoft.com/en-us/library/zst29sk2(vs.100).aspx

msdn图意味着单个文件程序集不包含模块,而是包含清单、IL代码、类型元数据等。这与我读过的许多其他文章不同,这些文章指出单个文件程序集有一个模块。

答案是什么?如果答案为"两者",那么模块是否是通过程序集清单链接的单独类型文件?


In .net the difference between an assembly and module is that a module
does not contain the manifest.

1
//Copied from CLR via C#

什么是舱单?

清单是另一组基本上包含作为程序集一部分的文件名的元数据表。他们也描述程序集的版本、区域性、发布者、公开导出的类型以及组成组件。

clr对程序集进行操作;也就是说,clr始终加载包含清单的文件首先是元数据表,然后使用清单获取程序集中其他文件/模块的名称。

如何组合模块以形成组件?

使用C编译器

了解如何构建多文件/多模块程序集,假设我们有两个源代码文件:

rut.cs,包含很少使用的类型

fut.cs,包含常用类型

让我们将很少使用的类型编译到它们自己的模块中,这样程序集的用户就不需要如果从不访问很少使用的类型,则部署此模块。

1
csc /t:module RUT.cs

这一行使C编译器创建rut.netmodule文件。此文件是标准的dll-pe文件,但是,就其本身而言,clr无法加载它。接下来,让我们将经常使用的类型编译到它们自己的模块中。我们将使这个模块保留程序集清单,因为类型经常使用。实际上,因为这个模块现在将表示整个程序集,我将把输出文件的名称更改为multipilelibrary.dll而不是调用fut.dll。

1
csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs

这一行告诉C编译器编译fut.cs文件以生成multifilelibrary.dll文件。因为/t:指定了library,将一个包含清单元数据表的dll-pe文件发送到多文件库.dll文件。netmodule开关告诉编译器rut.netmodule是应视为程序集一部分的文件。具体来说,/addmodule开关告诉编译器将文件添加到filedef manifest元数据表并公开添加rut.netmodule已将类型导出到exportedtypesdef manifest元数据表。

在编译器完成所有处理之后,将创建图2-1中所示的两个文件。右边的模块包含清单。

enter image description here

使用程序集链接器

al.exe实用程序可以生成仅包含描述其他模块中的类型。为了理解al.exe的工作方式,我们来更改multifilelibrary.dll的工作方式。程序集已生成。

1
2
3
csc /t:module RUT.cs
csc /t:module FUT.cs
al /out: MultiFileLibrary.dll /t:library FUT.netmodule RUT.netmodule

图2-3显示了执行这些语句所产生的文件。

enter image description here

我建议您阅读第2章:Jeffrey Richter通过C_从clr构建、打包、部署和管理应用程序和类型,以详细了解这个概念。


每个组件至少有一个模块。它是一个高度不可见的实现细节。但使用reflection.emit时可以看到它。从assemblybuilder类的示例代码中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
AssemblyBuilder ab =
    AppDomain.CurrentDomain.DefineDynamicAssembly(
        aName,
        AssemblyBuilderAccess.RunAndSave);

// For a single-module assembly, the module name is usually
// the assembly name plus an extension.
ModuleBuilder mb =
    ab.DefineDynamicModule(aName.Name, aName.Name +".dll");

TypeBuilder tb = mb.DefineType(
   "MyDynamicType",
     TypeAttributes.Public);

注意使用modulebuilder类时,类型被添加到模块中。一个程序集可以包含多个模块是非常不相关的,构建环境不支持它。不仅是IDE,MSBuild也不支持它。要使用程序集链接器al.exe,您必须自己编写一个生成脚本。我认为没有充分的理由这样做,所有的.NET编译器都已经知道如何直接生成单个模块程序集。al.exe是一个典型的引导工具,可能用于构建mscorlib.dll。


A module is a logical collection of code within an Assembly. You can have multiple modules inside an Assembly, and each module can be written in different .NET languages (VS, as far as I'm aware, doesn't support creation of multi-module assemblies).

Assemblies contain modules. Modules contain classes. Classes contain functions.

发件人:什么是.NET中的模块?

来自:必应搜索.NET模块与程序集