在.NET中,什么是模块?

58

什么是模块?模块、类和函数之间有什么区别?在C#中如何访问一个模块?

我想知道这些是因为我想在运行时计算某些特定函数的IL代码的校验和,而不使用代码签名。

4个回答

61

一个模块是程序集内的代码逻辑集合。程序集可以包含多个模块,每个模块可以用不同的.NET语言编写(就我所知,VS不支持创建多模块程序集)。

程序集包含模块。 模块包含类。 类包含函数。

是的,在运行时可以通过反射访问程序集、模块、类、函数、属性、字段等。


4
通常情况下(在 VS 中没有其他选择),一个程序集由一个模块组成。但是,使用命令行工具,您可以创建由多个模块组成的程序集(其中一个模块将包含整个程序集的元数据)。这对于允许 ClickOnce 的增量下载可能会很有用。 - Richard
但是一个模块是否可以跨越多个程序集呢? - 炸鱼薯条德里克

11
作为对其他答案的补充: MSDN 表示:“模块是一个没有程序集清单的 Microsoft 中间语言(MSIL)文件。”。 使用 Assembly Linker (al.exe) 工具生成程序集清单可以将多个模块“链接”在一起。如果我没记错的话,CLR 可以为一个程序集加载单独的模块,这样只有必要的模块才会被加载。 编辑:在 这里可以找到更好的 Netmodules 描述和为什么需要它们。 这里还有另一个关于校验和主题的问题。答案提到使用 GetILAsByteArray 方法获取 IL。

7

文件

这就是模块的含义。

module: A single file containing content that can be executed by the VES

(其中VES是一个程序,它读取.NET程序集并将其转换为机器代码。) 请参见http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf 第I部分第16页。

--

程序集是文件系统(模块)中的一组有机联系的文件。请参见http://msdn.microsoft.com/en-us/library/zst29sk2(vs.71).aspx

显然,类定义是在文件(模块)本身内部定义的。


3
还有一个 VB 中的“module”语句,与程序集和编译无关,类似于 C# 的静态类: https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/module-statement 模块语句定义了一个在其命名空间中可用的引用类型。模块(有时称为标准模块)类似于类,但有一些重要区别。每个模块仅有一个实例,不需要创建或分配给变量。模块不支持继承或实现接口。请注意,模块不是类或结构体所具有的数据类型 —— 不能将编程元素声明为模块的数据类型。
只能在命名空间级别使用模块。这意味着模块的声明上下文必须是源文件或命名空间,而不能是类、结构、模块、接口、过程或块。不能将模块嵌套在另一个模块中或嵌套在任何类型中。更多信息,请参阅“声明上下文和默认访问级别”。
模块的生存期与程序相同。因为它的所有成员都是共享的,所以它们的生存期也等同于程序的生存期。
模块默认为 Friend 访问级别。您可以使用访问修饰符调整其访问级别。有关更多信息,请参见 Visual Basic 中的访问级别。
模块的所有成员都是隐式共享的。
简而言之,VB 中的模块类似于 C# 的静态类。

1
欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - geisterfurz007
主要话题显然是专注于“模块”作为一种装配方式,因此当文档中已经详细描述时,我们并没有看到需要提供详细答案的必要。 - SENya
3
像你所做的引用是完全有效的。这只是为了确保如果链接由于任何原因失效,你的答案不会立即无效。感谢你的努力! - geisterfurz007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接