我对命名空间和程序集感到非常困惑。 System.Data
和System.Web
是命名空间还是程序集?
我注意到它们被称为命名空间,同时它们也存在于GAC_32
文件夹中。 那么它们到底是什么?
我对命名空间和程序集感到非常困惑。 System.Data
和System.Web
是命名空间还是程序集?
我注意到它们被称为命名空间,同时它们也存在于GAC_32
文件夹中。 那么它们到底是什么?
System.Data
是一个命名空间,System.Data.DLL
(文件)是一个程序集。
命名空间是类型的逻辑组合(主要用于避免名称冲突)。程序集可以包含多个命名空间中的类型(System.DLL
包含一些...),而单个命名空间可以分布在多个程序集中(例如System.Threading
)。
命名空间 是指属于同一功能的类的逻辑分组。所以 System.Web
和 System.Data
都是命名空间。
MSDN 将其描述为:
在 C# 编程中,命名空间有两种重要用途。首先,.NET Framework 使用命名空间来组织其众多的类。其次,声明自己的命名空间可以帮助控制较大编程项目中类和方法名称的作用域。
程序集 是可以由 .NET 运行时环境执行的 (预编译) 代码块。它包含一个或多个命名空间。一个 .NET 程序由一个或多个程序集组成。
System.Web.dll
和 System.Data.dll
都是程序集。
MSDN 将其描述为:
程序集是 .NET Framework 应用程序的构建块,它们形成部署、版本控制、重用、激活作用域和安全权限的基本单元。程序集是一组类型和资源,它们被构建成一起并形成逻辑功能单元。程序集提供了常规语言运行时所需的有关类型实现的信息。对于运行时来说,类型在程序集的上下文之外是不存在的。
它们是命名空间。程序集包含一个以上的命名空间。例如:System.dll
包含以下命名空间(以及更多):
一个命名空间可能包含嵌套的命名空间。它们只是用来组织代码的逻辑名称。请注意,DLL
文件是包含一个或多个命名空间的程序集。
GAC
是 全局程序集缓存。根据MSDN:
全局程序集缓存存储专门用于在计算机上由多个应用程序共享的程序集。
因此,常用的程序集存储在 GAC
中,因此您不需要将所有程序集文件复制到从项目中引用的项目目录中。存储在 GAC
中的程序集均为 Strong-Named 程序集。通常,当您从项目中添加对未经 Strong-Named 处理的程序集的引用时,会在您的 bin\Debug
文件夹中创建一个副本 of 您的 .dll
文件。如果您希望,可以使您的程序集(例如,类库项目)成为 Strong-Named。请参见:如何:使用强名称签名程序集
简而言之:
提示。
程序集包含多个类型(例如:程序集 System 包含许多包括 System, System.IO 等在内的命名空间)。 通常,程序集的名称与它所包含的命名空间相同,但不总是如此。
其它程序集和命名空间示例。
程序集 1 (CoreAssembly.DLL)
包含命名空间 Namespace1.subnamespace1
程序集 2 (ExtensionCoreAssembly.DLL)
包含命名空间 Namespace1.subnamespace1
可以使用包含不同命名空间的程序集名称,并通过这种技术扩展现有程序集来扩展另一个程序集。
定义.
程序集
程序集是一组类型和资源,形成一个逻辑功能单元。.NET Framework 中的所有类型都必须存在于程序集中;公共语言运行时不支持程序集外的类型。每次使用 Visual Basic .NET 创建 Microsoft Windows 应用程序、Windows 服务、类库或其他应用程序时,都正在构建单个程序集。每个程序集被存储为 .exe 或 .dll 文件。 注意 虽然在技术上可以创建跨多个文件的程序集,但在大多数情况下不太可能使用此技术。
命名空间
组织 Visual Basic .NET 代码的另一种方法是使用命名空间。命名空间不是程序集的替代品,而是补充程序集的第二种组织方法。命名空间是一种将类型名称分组并减少名称冲突机会的方式。命名空间可以包含其他命名空间和类型。类型的完整名称包括包含该类型的命名空间的组合。
其他人已经给出了非常好的和详细的答案。但是我想指出,当你不确定时,可以在MSDN上查找。MSDN库非常清晰简洁地解释了任何给定类型所在的命名空间和程序集。它甚至说出了文件的名称(在System.Data.dll中)
,因此没有歧义。
System.Data.dll
,这是一个包含命名空间(包括 System.Data
)的程序集。如果您在 Visual Studio 中查看引用属性,则会看到:
汇编语言是逻辑单元的物理分组,命名空间(logical units)是类的逻辑分组。
命名空间可以跨越多个汇编语言(assembly)。