.NET 中的程序集

程序集是 .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 方法。

公共语言运行时中的程序集

程序集为公共语言运行时提供识别类型实现所需的信息。 对于运行时来说,类型在程序集中上下文之外是不存在的。

程序集定义以下信息:

  • 公共语言运行时执行的代码。 每个程序集只能有一个入口点: DllMainWinMainMain

  • 安全边界。 程序集就是在其中请求和授予权限的单元。 有关程序集安全边界的详细信息,请参阅 程序集安全注意事项

  • 类型边界。 每一类型的标识均包括该类型所驻留的程序集的名称。 在一个程序集的作用域中加载的类型 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 中的 “添加引用 ”对话框或 -referenceC#Visual Basic 编译器的命令行选项添加对程序集的引用。

在 C# 中,可以在单个应用程序中使用同一程序集的两个版本。 有关详细信息,请参阅 外部别名

标题 DESCRIPTION
程序集内容 组成程序集的元素。
程序集清单 程序集清单中的数据,以及它如何存储在程序集中。
全局程序集缓存 GAC 如何存储和使用程序集。
具有强名称的程序集 具有强名称的程序集的特征。
程序集安全注意事项 安全性如何作用于程序集。
程序集版本控制 .NET Framework 版本控制策略概述。
程序集位置 在何处可以找到程序集。
程序集和并行执行 同时使用多个版本的运行时或程序集。
生成动态方法和程序集 如何创建动态程序集。
运行时如何查找程序集 .NET Framework 如何在运行时解析程序集引用。

参考文献

System.Reflection.Assembly

另请参阅