程序集是 .NET 应用程序中部署、版本控制、重用、激活范围和安全权限的基本单元。 程序集是用于协同工作并形成逻辑功能单元的类型和资源集合。 程序集采用可执行(.exe)或动态链接库(.dll)文件的形式,是 .NET 应用程序的构建基块。 它们为公共语言运行时环境提供所需信息,以便其了解类型实现。
在 .NET 和 .NET Framework 中,可以从一个或多个源代码文件生成程序集。 在 .NET Framework 中,程序集可以包含一个或多个模块。 这样,就可以规划更大的项目,以便多个开发人员可以处理单独的源代码文件或模块,这些文件或模块组合在一起以创建单个程序集。 有关模块的详细信息,请参阅 如何:生成多文件程序集。
程序集具有以下属性:
程序集作为 .exe 或 .dll 文件实现。
对于面向 .NET Framework 的库,可以通过将程序集放在 全局程序集缓存 (GAC)中,在应用程序之间共享程序集。 必须先对程序集进行强命名,然后才能将它们包含到 GAC 中。 有关详细信息,请参阅具有强名称的程序集。
只有在需要使用时才会将程序集加载到内存中。 如果未使用程序集,则不加载。 因此,程序集可以是管理大型项目中资源的高效方法。
可以使用反射以编程方式获取有关程序集的信息。 有关详细信息,请参阅反射(C#)或反射(Visual Basic)。
可以在 .NET 和 .NET Framework 上使用 MetadataLoadContext 类来加载程序集,从而检查它。 MetadataLoadContext 替换 Assembly.ReflectionOnlyLoad 方法。
公共语言运行时中的程序集
程序集为公共语言运行时提供识别类型实现所需的信息。 对于运行时来说,类型在程序集中上下文之外是不存在的。
程序集定义以下信息:
公共语言运行时执行的代码。 每个程序集只能有一个入口点:
DllMain
,WinMain
或Main
。安全边界。 程序集就是在其中请求和授予权限的单元。 有关程序集安全边界的详细信息,请参阅 程序集安全注意事项。
类型边界。 每一类型的标识均包括该类型所驻留的程序集的名称。 在一个程序集的作用域中加载的类型
MyType
与在另一个程序集的作用域中加载的类型MyType
不同。引用范围边界:程序集清单具有用于解析类型和满足资源请求的元数据。 清单指定要在程序集外部公开的类型和资源,并枚举它依赖的其他程序集。 除非具有关联的 程序集清单,否则不会执行可移植可执行文件 (PE) 文件中的公共中间语言 (CIL) 代码。
版本边界。 该程序集是公共语言运行时中最小的可版本控制单元。 同一程序集中的所有类型和资源均会被版本化为一个单元。 程序集清单描述为任何依赖程序集指定的版本依赖项。 有关版本控制的详细信息,请参阅 程序集版本控制。
部署单元:当应用程序启动时,只有应用程序最初调用的程序集必须存在。 可以按需检索其他程序集,例如包含本地化资源或实用工具类的程序集。 此过程允许应用在首次下载时简单而精简。 有关部署程序集的详细信息,请参阅 “部署应用程序”。
并行执行单元:有关运行程序集的多个版本的详细信息,请参阅程序集和并行执行。
创建程序集
程序集可以是静态的或动态的。 静态程序集存储在可移植可执行文件(PE)文件中的磁盘上。 静态程序集可以包括接口、类和资源,如位图、JPEG 文件和其他资源文件。 还可以创建动态程序集,这些程序集直接从内存运行,在执行之前不会保存到磁盘。 在执行动态程序集后,可以将动态程序集保存到磁盘。
有几种创建程序集的方法。 可以使用开发工具(如 Visual Studio)创建 .dll 或 .exe 文件。 可以使用 Windows SDK 中的工具通过其他开发环境中的模块创建程序集。 还可以使用公共语言运行时 API(例如 System.Reflection.Emit)创建动态程序集。
可以采用以下方法编译程序集:在 Visual Studio 中生成程序集、使用 .NET Core 命令行接口工具生成程序集,或使用命令行编译器生成 .NET Framework 程序集。 有关使用 .NET CLI 生成程序集的详细信息,请参阅 .NET CLI 概述。
注释
若要在 Visual Studio 中生成程序集,请在 “生成 ”菜单上选择“ 生成”。
程序集清单
每个程序集都有一个 程序集清单 文件。 与目录类似,程序集清单包含以下内容:
程序集的标识(名称和版本)。
描述包含构成程序集的所有其他文件的文件表,例如您创建的构成 .exe 或 .dll 文件所依赖的其他程序集、位图文件或自述文件。
程序集引用列表,它是所有外部依赖项的列表,例如 .dll或其他文件。 程序集引用包含对全局对象和私有对象的引用。 全局对象可用于所有其他应用程序。 在 .NET Core 中,全局对象与特定的 .NET Core 运行时耦合。 在 .NET Framework 中,全局对象驻留在全局程序集缓存中(GAC)。 System.IO.dll 是 GAC 中的程序集的示例。 专用对象必须位于安装应用的目录级别或目录下。
程序集包含有关内容、版本控制和依赖项的信息。 因此,使用这些应用程序不需要依赖于外部源(如 Windows 系统上的注册表)才能正常运行。 程序集可减少 .dll 冲突,并使应用程序更易于部署。 在许多情况下,可以安装 .基于 NET 的应用程序只需将其文件复制到目标计算机即可。 有关详细信息,请参阅 程序集清单。
添加对程序集的引用
若要在应用程序中使用程序集,必须添加对它的引用。 引用程序集时,其命名空间的所有可访问类型、属性、方法和其他成员都可供应用程序使用,就像其代码是源文件的一部分一样。
注释
.NET 类库中的大多数程序集会被自动引用。 如果未自动引用系统程序集,请通过以下方式之一添加引用:
- 对于 .NET 和 .NET Core,请添加对包含程序集的 NuGet 包的引用。 在 Visual Studio 中使用 NuGet 包管理器,或者将<PackageReference>元素添加到.csproj 或 .vbproj 项目的程序集。
- 对于 .NET Framework,请使用 Visual Studio 中的 “添加引用 ”对话框或
-reference
C# 或 Visual Basic 编译器的命令行选项添加对程序集的引用。
在 C# 中,可以在单个应用程序中使用同一程序集的两个版本。 有关详细信息,请参阅 外部别名。
相关内容
标题 | DESCRIPTION |
---|---|
程序集内容 | 组成程序集的元素。 |
程序集清单 | 程序集清单中的数据,以及它如何存储在程序集中。 |
全局程序集缓存 | GAC 如何存储和使用程序集。 |
具有强名称的程序集 | 具有强名称的程序集的特征。 |
程序集安全注意事项 | 安全性如何作用于程序集。 |
程序集版本控制 | .NET Framework 版本控制策略概述。 |
程序集位置 | 在何处可以找到程序集。 |
程序集和并行执行 | 同时使用多个版本的运行时或程序集。 |
生成动态方法和程序集 | 如何创建动态程序集。 |
运行时如何查找程序集 | .NET Framework 如何在运行时解析程序集引用。 |