什么是 System.Reflection.Module?

What is System.Reflection.Module?

刚刚在智能感知中注意到 Assembly.LoadModule()。我看到它 returns 是对基本上未记录的 Module class 的引用。

我很了解反射,但我从未听说过模块?这些是什么?这个名字很诱人。

模块是 .NET 中可执行代码的存储单元。程序集是一个或多个模块的集合。解释术语"assembly",它是模块的集合。你很少遇到这个概念,它被 .NET 中的构建工具隐藏了。但是,当您查看使用 TypeBuilder class.

在 运行 时间动态生成代码所需的代码类型时,这一点非常明显。

注意链接的 MSDN 文章中的代码示例。您从 AssemblyBuilder 开始。您向其添加 ModuleBuilder。您向其添加 TypeBuilder。您可以向其中添加字段、构造函数和方法。很好的展现了内部层次

您可以创建自己的模块,但 MSBuild 不直接支持,您必须自己 运行 构建工具。 C# 编译器的 /target:module command line option tells it to create a module. And you have to use the assembly linker, al.exe,将模块粘合在一起成为一个程序集。我能想到的唯一实际用途是创建包含用不同语言编写的代码的程序集。混合使用 C++/CLI 和 C# 将是一个实际示例。

几乎所有日常使用的程序集都只包含一个模块。 C#编译器隐藏了最后一步,创建程序集,它在编译时直接调用程序集链接器。 C:\Windows\Microsoft.NET\Framework\v4.0.30319\alink.dll 在你的机器上。

一个程序集可以由多个模块组成,甚至可以拆分成多个文件。

使用模块有两个主要用例:

  • 将用不同语言编写/由不同编译器编译的模块组合在一个程序集中
  • 通过轻量级主模块和按需加载更多类型来优化应用程序的下载速度。

模块在某种程度上是一个时代的产物,当时 .NET 团队认为用户能够通过网络将程序集下载到他们的本地机器上执行是很重要的。

为了节省带宽,可以将程序集拆分为多个文件,每个文件包含一个模块。包含主模块或主模块的程序集文件包含一个 assembly manifest,它列出了所有其他程序集文件的位置。这允许开发人员确保快速初始下载主程序集,并且运行时按需从程序集中的其他模块加载类型或资源。

如果你很好奇,你实际上可以指示 C# 编译器吐出一个模块并使用程序集链接器手动编译它们。这是 tutorial on MSDN.

今天的大多数程序集都是仅包含一个主模块的单模块程序集。除非您以编写处理反射(或原始 IL)的代码为生(我以前做过),否则只要在需要时执行 assembly.MainModule 就可以了。我很确定使用 multil-file/multi-module 的人数是 ɛ (仅略大于 0)。