什么是System.Reflection.Module?

Geo*_*uer 7 .net reflection base-class-library

刚刚Assembly.LoadModule()在intellisense中注意到了.我看到它返回对基本未记录的Module类的引用.

我知道反思很好,我从来没有听说过模块吗?这些是什么?这个名字很诱人.

Joh*_*lph 6

程序集可以包含多个模块,甚至可以拆分为多个文件.

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

  • 将用不同语言编写的模块/由不同编译器编译在一个程序集中
  • 通过使用轻量级主模块并按需加载其他类型来优化应用程序的下载速度.

模块部分是.NET团队认为用户能够通过网络将程序集下载到本地计算机执行的重要工具.

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

如果您很好奇,您实际上可以指示C#编译器吐出模块并使用程序集链接器手动编译它们.这是关于MSDN的教程.

今天的大多数组件都是仅包含主模块的单模块组件.除非你编写处理Reflection(或原始IL)的代码(我做了一些时间),如果你只是assembly.MainModule在需要的时候做的话你会没事的.我很确定使用multil-file/multi-module的人数是ɛ(仅略大于0).


Han*_*ant 5

模块是.NET中可执行代码的存储单元.程序集是一个或多个模块的集合.解释术语"组件",它是模块的组合.您很少遇到这个概念,它被.NET中的构建工具所隐藏.但是,当您查看使用TypeBuilder类在运行时动态生成代码所需的代码类型时,它非常明显.

请注意链接的MSDN文章中的代码示例.您从AssemblyBuilder开始.您添加了ModuleBuilder.您要向其添加TypeBuilder.添加字段,构造函数和方法.很好地显示内部层次结构.

您可以创建自己的模块,但MSBuild不直接支持,您必须自己运行构建工具.C#编译器的/ target:module命令行选项告诉它创建一个模块.您必须使用程序集链接器al.exe将模块粘合到一个程序集中.我能想到的唯一实际用途是创建包含用不同语言编写的代码的程序集.混合C++/CLI和C#将是一个实际的例子.

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