什么是.NET程序集?

209

.NET程序集是什么?我在网上搜索过,但无法理解定义。


11
请阅读《CLR Via C#》(http://www.amazon.com/CLR-Via-C-Pro-Developer/dp/0735621632)。读完后,您将对此有全面的了解。我强烈推荐这本书。 - David Neale
13个回答

262

汇编是 .net 应用程序最小部署单元的形式,可以是dllexe.
总体上,它主要有两种类型:

  1. 私有汇编: 是仅属于一个应用程序的 dll 或 exe。通常存储在应用程序根文件夹中。

  2. 公共 / 共享汇编: 是可供多个应用程序同时使用的 dll。共享汇编存储在全局程序集缓存(GAC)中。

听起来困难么?不会的....
GAC 是简单的C:\Windows\Assembly文件夹,在其中可以找到您计算机上安装的所有软件的公共汇编/ dll。

还有第三种少为人知的汇编类型: 卫星汇编(Satellite Assembly)
卫星汇编仅包含诸如图像和应用程序所需的其他非可执行文件等静态对象。


3
请注意,对于.NET 4.0,位置已更改:https://dev59.com/QXE85IYBdhLWcg3wr1ke - TrueWill
当一个文件夹中有一千个这样的文件时,Windows 尝试遍历目录树或仅读取目录时会变得更慢。 - Jim Michaels

182

简单来说:一块可以由.NET运行时环境执行的(预编译)代码。一个.NET程序由一个或多个程序集组成。


32
@KimJongWoo - 不,一个Jar文件只是一个包含已编译字节码文件的Zip文件。汇编语言是一个PE(便携式可执行文件格式)文件(即DLL或EXE),但在概念上它们具有类似的作用。 - Erik Funkenbusch
那么这就像是Java世界中的一个.class文件? - mljrg

20

除了已接受的答案外,我想给你一个例子!

例如,我们都使用

System.Console.WriteLine()

但System.Console.WriteLine的代码在哪里呢!?实际上是哪段代码将文本输出到控制台?

如果您查看Console类文档的第一页,您会在顶部附近看到以下内容:程序集:mscorlib(位于 mscorlib.dll 中)。 这表明Console类的代码位于名为mscorlib的程序集中。程序集可以由多个文件组成,但在此情况下只有一个文件,即动态链接库mscorlib.dll。

mscorlib.dll文件在.NET中非常重要。它是.NET类库的主要DLL,并包含所有基本的.NET类和结构。

如果你了解C或C ++,通常需要在顶部使用 #include 指令引用头文件。该 include 文件向编译器提供函数原型。相反,C#编译器不需要头文件。在编译期间,C#编译器直接访问mscorlib.dll文件,并从该文件中的元数据获取有关其中定义的所有类和其他类型的信息。

C#编译器可以确定mscorlib.dll确实包含一个名为System的命名空间中的Console类,以及一个名为WriteLine的方法,该方法接受一个字符串类型的单个参数。

C#编译器可以确定WriteLine调用是有效的,并在可执行文件中建立对mscorlib程序集的引用。

默认情况下,C#编译器将访问mscorlib.dll,但对于其他DLL,您需要告诉编译器类所在的程序集。这些被称为引用(reference)

希望现在清楚了!

来自DotNetBookZero Charles pitzold


10
维基百科解释如下:
在 Microsoft .NET 框架中,程序集是部分编译的代码库,用于部署、版本控制和安全性。有两种类型:进程程序集(EXE)和库程序集(DLL)。进程程序集代表将使用库程序集中定义的类的进程。.NET 程序集包含 CIL 中的代码,这通常是从 CLI 语言生成的,然后由 CLR 即时编译器在运行时编译为机器语言。一个程序集可以由一个或多个文件组成。代码文件称为模块。一个程序集可以包含多个代码模块,由于可以使用不同的语言创建代码模块,因此在技术上可以使用几种不同的语言创建程序集。但是,Visual Studio 不支持在一个程序集中使用不同的语言。
如果您真的浏览了,那么澄清您不理解的内容会有所帮助。

7
在微软的.NET框架中,程序集是一个部分编译的代码库,用于部署、版本控制和安全性。请参考这里

7

IL代码中包含了类、接口、枚举等的物理集合。这些集合可以是.EXE或.DLL文件。.EXE是可执行文件,而.DLL可以在任何.NET支持的语言中动态使用。


7
一个程序集是一个包含类型和资源的集合,形成了一个逻辑功能单元。在.NET Framework中,所有类型都必须存在于程序集中;公共语言运行时不支持程序集之外的类型。每次使用Visual Basic .NET创建Microsoft Windows®应用程序、Windows服务、类库或其他应用程序时,您都在构建一个单独的程序集。每个程序集都存储为.exe或.dll文件。
来源:https://msdn.microsoft.com/en-us/library/ms973231.aspx#assenamesp_topic4 对于像我这样有Java背景的人,希望下面的图表能够澄清概念-
程序集就像包含多个.class文件的jar文件一样。您的代码可以引用现有程序集,或者您自己的代码可以发布为程序集供其他代码引用和使用(您可以认为这是Java中添加到项目依赖项的jar文件)。
归根结底,程序集是编译后的代码,可以在安装了CLR的任何操作系统上运行。这与说.class文件或捆绑的jar文件可以在安装了JVM的任何计算机上运行相同。
图片链接:enter image description here

5

MSDN有一个很好的解释:

程序集是.NET Framework应用程序的构建块; 它们形成部署、版本控制、重用、激活作用域和安全权限的基本单位。程序集是一组类型和资源,它们被构建为协同工作并形成一个逻辑功能单元。程序集向公共语言运行时提供所需的信息,以便了解类型实现。对于运行时来说,在程序集的上下文之外,类型是不存在的。


2
作为微软.Net中版本控制、部署和代码重用的最小单元,程序集扮演着重要角色。
它包含以下内容:
- Assembly Identity
- Manifest
- Metadata
- MSIL Code
- Security Information
- Assembly Header

2
在 .Net 中,一个程序集可以是以下内容的“集合”:
- 包含可管理的各种部分,包括类型(或类)、资源(位图/图像/字符串/文件)、命名空间、配置文件;
- 编译为私有或公共的形式;
- 部署到本地或共享(GAC)文件夹;
- 可被其他程序/程序集发现;
- 可以进行版本控制。

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