C#或.NET中的Assembly是什么?

157

请您解释一下在C#或.NET中,什么是Assembly?

  1. 它从哪里开始,又从哪里结束?
  2. 我需要了解哪些关于Assemblies的重要信息?

8
严格来说,汇编是.NET概念,而不是C#概念,你同意吗? - JeffH
20
@JeffH: 当我提出这个问题时,我以为它是 C# 的概念。现在我明白了它是 .NET 的概念。尽管如此,因为我认为其他人可能会像我一样感到困惑,我故意没有改变它,让 Google 适应这个错误... - Roee Adler
2
这也是C#的一个概念。你必须理解它才能正确使用“internal”访问修饰符。 - Jan Rozycki
我的一点看法:https://dev59.com/YHRB5IYBdhLWcg3weHHx#54803483 - carloswm85
10个回答

161

一个程序集是您的代码的编译输出,通常是一个DLL文件,但您的EXE也是一个程序集。它是任何.NET项目的最小部署单元。

程序集通常包含.NET代码的MSIL(Microsoft中间语言),第一次在给定的计算机上执行时将被编译为本地代码(“JITted” -由即时编译器编译)。编译后的代码也将存储在程序集中,并在随后的调用中重复使用。

程序集还可以包含资源,如图标、位图、字符串表等等。此外,程序集还包含程序集清单中的元数据 - 例如版本号、强名称、文化、引用的程序集等等。

在99%的情况下,一个程序集等于磁盘上的一个物理文件 - 多文件程序集(一个程序集分布在多个文件中)的情况似乎是一个相当奇怪的特例,在我五年多的.NET开发中从未遇到过。

在多文件程序集中,仍然会有一个程序集清单在DLL或EXE中,并且MSIL代码在多个netmodule文件中。


1
@marc_s:我想你是指多程序集文件。通过Visual Studio的命令行工具,可以将多个程序集打包到单个文件中,但不能直接通过IDE完成。 - Greg D
6
程序集中非常重要的一点是程序集清单中的元数据。该清单包含版本、强名称、区域性、引用的程序集等信息。在多文件程序集中,仍然只有一个程序集清单存储在DLL或EXE文件中,而MSIL代码则存储在多个.netmodule文件中。基本上,程序集是.NET中最小的部署单位。 - softveda
@marc_s:如果您能将@Pratik的观点添加到答案中,我会非常感激。谢谢。 - Roee Adler
@rax:完成了;@pratik:现在你让我困惑了:你再次谈到“多文件汇编”,而@GregD提到它实际上是“多汇编文件”-现在是什么情况?(正如我所说-我从未遇到过这样的野兽,所以我有点不清楚它是每个文件多个汇编还是每个汇编多个文件....) - marc_s
@GregD:看起来确实是“多文件汇编”-请查看http://msdn.microsoft.com/en-us/library/226t7yxe.aspx - marc_s
3
那个编译的代码也会被存储在程序集中并在后续调用中重新使用。这句话有误导性,或者不是非常清晰。没有编译的代码“存储”在程序集中。我认为你可能指的是每个方法/函数在第一次调用时被“JITted”到本机代码,然后在程序集在内存中时,该方法的本机代码版本被调用。如果卸载程序集,然后稍后重新加载,JIT过程将再次发生。当然,这假设您没有使用NGEN将程序集预编译为本机代码(不建议这样做)。 - Ash

20
答案是为了立即理解而排序。
简单来说,它是涉及您的类和其他文件(如果有的话)的编译项目。也就是说,解决方案中的每个项目都是一个“程序集”。
或者更加技术性地说,
“程序集”是存储类型的地方,它们存储在文件系统中。程序集是部署代码的机制。例如,“System.Data.dll”程序集包含用于管理数据的类型。要使用其他程序集中的类型,必须引用它们。- 来源 我们如何知道这一点?如果您查看解决方案下的项目的属性,您可以看到以下图像。
当您编译项目时,它会变成DLL或EXE。

enter image description here enter image description here enter image description here


有没有办法从IDE中找到实际的程序集文件?我知道可以在Windows资源管理器中找到它,在项目的bin文件夹中,但这是一种不切实际的查找文件的方式。 - carloswm85
@carloswm85 为什么不直接右键单击并定位它的文件夹呢?https://i.stack.imgur.com/RzsRB.png - Soner from The Ottoman Empire
这不是我想要的解决方案。我不想访问Windows资源管理器。不过我找到了一个解决方案。在VS19中:在“解决方案资源管理器”中单击“显示所有文件”菜单按钮,然后bin文件夹(和其他文件夹)将出现。打开“debug”文件夹,右键单击所需程序集,然后单击“复制路径”。 - carloswm85

14

.NET程序集

在Microsoft .NET框架中,程序集是一种部分编译的代码库,用于部署、版本控制和安全性。


9

2
程序集与包含它们的文件是不同的。 - Greg D
1
@Raghav - 为了天堂的缘故,请更新您的照片,换成一些休闲的东西!你知道我们这里不是在为护照拍照吧! - Robin Rodricks

4

这里有另一个关于.NET程序集构成的解释,摘录如下:

.NET框架由模块和程序集概念组成,它们都存储元数据和清单信息。一个程序集可以包含多个模块。Visual C#只创建一个模块,由C#编译器(csc.exe)将其转换为程序集,但是一个程序集可以通过程序集链接器(al.exe)命令行工具链接多个.NET模块。例如,您的每个源代码.cs文件都可以编译为一个模块,并链接在一起形成一个程序集 - 一个程序集只是模块和资源的集合。然而,其中一个模块必须包含清单元数据(见下文),CLR才能理解程序集。
....
在VS.NET中创建一个新的.exe或.dll后,您会看到文件出现在bin文件夹中。在记事本中打开它会输出乱码,即使在十六进制编辑器中也需要知道文件结构,您需要像ildasm.exe或CFF Explorer这样的工具才能从中获取有意义的信息。程序集的结构如下所示:
PE头
CLR头
CLR元数据
CLR
IL代码
本机数据

1
这个链接到底要带我去哪里?无限重定向!经过几次重定向,它带我到了一个页面,上面写着this。也没有办法获取你发布的原始URL。 - Sнаđошƒаӽ

1
当源代码被语言编译器编译时,它会生成一个托管程序集和 MSIL(Microsoft 中间语言)。该程序集包含 .dll 或 .exe 文件。程序集可以分为两种类型:私有程序集和共享程序集。共享程序集存储在 GAC(全局程序集缓存)中,以便任何应用程序都可以引用它,而私有程序集存储在应用程序文件夹中,只能由一个应用程序使用。

0

汇编是一个DLL或EXE,当您发布或编译应用程序时将创建它。


0

程序集是逻辑单元的集合。逻辑单元指构建应用程序并使用 .Net 框架部署它们所需的类型和资源。基本上,程序集是 Exe 和 DLL 的集合。它是可移植且可执行的。


0
编写程序(项目)源代码后,将创建一个文件,该文件可能是DLL或EXE,这取决于您的项目。对于单个项目,仅创建一次。它有两种类型: 1:- 单个 2:- 共享或多程序 单个程序集仅用于单个程序,而共享程序集可用于多个程序。

编写程序(项目)的源代码后,将创建一个文件,该文件可能是DLL或EXE,这取决于您的项目。- 在编写源代码之后?这似乎并不是很好的指示“何时”创建该文件,但这对于问题来说并不重要。 - Sнаđошƒаӽ

0
程序集是由CSC(C#编译器)在编译'.cs'文件时创建的不同文件的集合。如果.cs文件包含一个主方法,.exe(可执行文件)将是该程序集的一部分,否则.dll(动态链接库)将是该程序集的一部分。除了.exe/.dll之外,程序集还包含清单文件(程序集的元数据),资源命名空间(包含特定语言的代码修改,例如法语、阿拉伯语等的资源文件),卫星文件(用于不同文化/语言的单独程序集文件)。这些程序集代码文件是用MSIL(Microsoft中间语言)编写的,它是一种类似于Java字节码的中间代码。

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