从 CLR 通过 C#,我了解到程序集由托管模块组成。
.Net 中的托管模块是 .netmodule。
- 显然我开始感到困惑,并且我知道许多 .netmodules 构成一个托管模块,而后者又是一个程序集,是这样吗?
- 在由多个 .netmodules 组成的多文件程序集中,我的一个问题得到了回答,即 .netmodule 几乎就像一个程序集,但只有没有清单,有一个主要的 .netmodule 在其中定义了清单。主模块由 exe 或 dll 扩展名表示,那么程序集清单是否指示应该是什么扩展名?
另一个问题出现了,在.netmodule结构中有一个PE头决定了文件的类型,事实证明,如果我可以这么说,在将清单安装到其中之前,表明该文件具有.netmodule类型,并且当程序集清单安装到其中时,这种类型会更改为 dll 还是 exe?
.netmodule 只是使用-target:module选项编译时由 C#/VB 编译器生成的默认文件扩展名,或使用/LN选项编译的Visual C++ 。当然,任何 .netmodule 文件都是托管模块,但反之则不然。将其视为一种托管模块。
.netmodule 文件是一个带有 .NET 元数据的 PE 文件,可能还有一段 CIL 代码,但没有程序集清单,即 ildasm 输出中的 .assembly 指令所表示的内容。让我们有条件地称这样的文件为不完整模块。无法加载和执行,但可以提交到特殊实用程序的输入,在Can an assembly is called multi-module问题的回答中有详细描述。扩展本身似乎没有在规范中的任何地方注册,也就是说,理论上,一个不完整的模块也可以分配 .dll 扩展。但在这种情况下,任何实用程序都不会正确处理它。
正常编译生成的 DLL 或 EXE 文件可以称为完整模块,而不是 .netmodule 。然后我们得到以下可能的装配结构配置: