【C#基础概念】程序集Assembliy
阅读原文时间:2023年07月08日阅读:2

通常,静态程序集可能由以下四个元素组成:

  • 程序集清单(manifest)

  • 类型元数据metadata和程序集元数据。

  • 实现这些类型的 Microsoft 中间语言 (MSIL) 代码。 它由编译器从一个或多个源代码文件生成。

  • 资源集。图片 xml 音频等

内容来源:https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/contents

程序集是根据程序集的版本号 来区别。

CLI程序集可分为两类:进程程序集(EXE)、库程序集(DLL)。

注意:并不是.exe .dll文件都是.net程序集,com组件也是分为.exe .dll两种组件

其中.exe文件是一个自己执行的程序集,而.dll将被其他程序集加载后运行。

每个程序集都有一个程序集清单文件。 与目录类似,程序集清单包含以下内容:

  • 程序集的标识(名称和版本)。

  • 文件表,描述构成程序集的其他所有文件(例如,.exe 或 .dll 文件所依赖的你创建的其他程序集、位图文件或自述文件) 。

  • 程序集引用列表,即所有外部依赖项的列表,如 .dll 或其他文件 。 程序集既可以引用全局对象,也可以引用私有对象。 全局对象可用于所有其他应用程序。 在 .NET Core 中,全局对象与特定的 .NET Core 运行时结合使用。 在 .NET Framework 中,全局对象位于全局程序集缓存 (GAC) 中。 System.IO.dll 是 GAC 中程序集的一个示例。 私有对象必须位于级别不高于应用安装目录的目录中。

  • 模块,组成程序集的模块

由于程序集包含内容、版本控制和依赖项的相关信息,因此使用它们的应用程序不依赖 Windows 系统上的注册表等外部源也能正常运行。 程序集减少了 .dll 冲突,让应用程序变得更可靠、更易于部署。 在许多情况下,只需将 .NET 应用程序的文件复制到目标计算机,即可进行安装。

程序集编译为IL代码,这是一种中间语言。框架内部把IL字节码转换为本地的汇编代码。对于打印"Hello World"的程序,其等效的IL代码是:

.method private hidebysig static void Main(string[] args) cil managed {
.entrypoint
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor() = ( 01 00 00 00 )
// Code size 11 (0xb)
.maxstack 1
IL_0000: ldstr "Hello World"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
IL_000a: ret } // end of method Class1::Main

内容来源:https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/view-contents

https://docs.microsoft.com/zh-cn/dotnet/standard/assembly/versioning

1.命名控件与程序集的区别。

命名空间用于对类型进行逻辑分组。程序集则是程序的物理分组,对应于一个dll或exe文件。

2.为什么要使用两种方式分组?把逻辑分组作为物理分组不是更简单吗?

    逻辑分组主要针对开发人员,而物理分组主要针对安装和部署。