刚刚在智能感知中注意到了Assembly.LoadModule()
。我看到它返回一个对基本未记录的Module类的引用。
我知道反射很好,我从来没有听说过模块?它们是什么?这个名字很诱人。
程序集可以由多个模块组成,甚至可以拆分为多个文件。
使用模块有两个主要用例:
- 将用不同语言编写/由不同编译器编译的模块组合在一个程序集中
- 通过使用轻量级主模块并根据需要加载其他类型来优化应用程序的下载速度。
模块在某种程度上是。net团队认为用户能够通过网络将程序集下载到本地机器上执行是很重要的。
为了节省带宽,可以将程序集拆分为多个文件,每个文件包含一个模块。包含主模块或主模块的程序集文件包含一个程序集清单,该清单列出了所有其他程序集文件的位置。这允许开发人员确保主程序集的快速初始下载,并且运行时根据需要从程序集中的其他模块加载类型或资源。
如果你很好奇,你实际上可以指示c#编译器吐出一个模块,并使用汇编链接器手动编译它们。这是一个关于MSDN的教程。
现在大多数程序集都是单模块程序集,只包含一个主模块。除非您以编写处理反射(或原始IL)的代码为生(我以前做过一段时间),否则只要在需要时使用assembly.MainModule
就可以了。我很确定使用多文件/多模块的人数是0(仅略大于0)。
模块是。net中可执行代码的存储单元。程序集是一个或多个模块的集合。解释了术语"汇编",它是模块的汇编。你很少遇到这个概念,它被。net中的构建工具所隐藏。但是,当您查看需要在运行时使用TypeBuilder类动态生成代码的代码时,它是非常明显的。
请注意链接的MSDN文章中的代码示例。从AssemblyBuilder开始。向它添加一个ModuleBuilder。向其添加一个TypeBuilder。向其添加字段、构造函数和方法。很好地显示了内部层次结构。
你可以创建自己的模块,但这不是MSBuild直接支持的,你必须自己运行构建工具。c#编译器的/target:module命令行选项告诉它创建一个模块。您必须使用汇编链接器。exe将模块粘合到一个汇编中。我能想到的唯一实际用途是创建包含用不同语言编写的代码的程序集。将c++/CLI和c#混合使用将是一个实际的例子。
几乎所有日常使用的程序集都只包含一个模块。c#编译器隐藏了最后一步,创建程序集,它在编译时直接调用程序集链接器。C:WindowsMicrosoft.NETFrameworkv4.0.30319 link.dll在你的机器上。