命名空间是一个程序集还是一个项目?

6

明天我要参加一场面试,正在复习一些.NET相关的内容。

MSDN将Internal关键字定义为:

仅在同一程序集内的文件中才能访问内部类型或成员

但我似乎找不到程序集的定义。是指同一命名空间内的所有内容,还是同一项目内的所有内容,还是其他什么?


第二个选项是正确的 - 同一个项目。 - Dmitry
6个回答

11
程序集和命名空间是相互独立的。一个程序集可以包含多个命名空间,而一个命名空间可以跨越多个程序集。在.NET框架中,程序集是最小的、可以独立版本化的代码单元。程序集定义了代码的物理组织形式(将代码组织成dll或exe文件),而命名空间定义了逻辑组织形式。一个程序集就是一个dll或exe文件,而命名空间是基于技术或功能的逻辑分组。
请注意,我并没有提到项目。项目只与特定的构建系统相关。.NET运行时本身并不知道项目。由于大多数人使用Visual Studio和MSBuild工具进行开发,并且默认情况下一个项目会生成一个单一的程序集,人们倾向于在日常对话中混用“项目”和“程序集”这两个术语。像MonoDevelop等其他工具也遵循类似的模式,但没有规定一个项目必须生成一个程序集的规则。

5

一个Assembly是已编译为.DLL或.EXE的项目。对于Visual Studio而言,任何类库项目、Windows窗体应用程序或WPF应用程序都将编译成一个Assembly。


4
在一个程序集中,你可以定义多个命名空间。程序集是.NET中最小的部署单元。它是你的IL代码和关于你的代码的元数据的集合。它包含一个名为清单的文件,在其中声明了在你的程序集中使用或引用的所有类型。此外还有一些其他文件。
正如MSDN中更正式地说明的那样:
“程序集是.NET Framework应用程序的构建块;它们形成部署、版本控制、重用、激活范围和安全权限的基本单位。程序集是一组类型和资源,它们被构建为一起工作并形成一个逻辑功能单元。程序集向公共语言运行时提供了它需要知道类型实现的信息。对于运行时,类型不存在于程序集的上下文之外。”
另一方面,对于一个命名空间,我们有:

命名空间关键字用于声明一个包含一组相关对象的作用域。您可以使用命名空间来组织代码元素并创建全局唯一类型。

正如MSDN所述。

从上面可以清楚地看出,您可以在程序集内声明任意多个命名空间。

一个很好的免费工具,您可以用它来查看程序集中的内容是IL Disassembler


1

汇编语言是一个物理的容器文件(DLL或EXE)。

虽然有些不寻常,但命名空间可以跨越多个汇编语言。


1

内部类不一定对同一命名空间内所有类可见,因为一个命名空间可以跨越多个程序集。程序集是编译好的文件(DLL或EXE)。

通常情况下指的是在同一个项目中,但也有将多个项目的输出组合成一个程序集的方法(通过ILMERGE)。


1
在.NET世界中,Assembly是一组已编译代码的包。它可以是可执行文件(.exe文件)或共享库(.dll文件),并且可以包含多个命名空间。

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