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


102

您能否解释一下什么是C#或.NET中的Assembly?

  1. 它在哪里开始,在哪里结束?
  2. 我应该了解有关装配的哪些重要信息?

5
严格来说,程序集不是.NET概念而是C#概念吗?
JeffH

14
@JeffH:当我问这个问题时,我认为这是一个C#概念。现在我知道它是一个.NET。但是,由于我认为其他人可能会像我一样感到困惑,因此我故意没有更改Google的位置以适应此错误……
Roee Adler 2009年

Answers:


114

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

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

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

在99%的情况下,一个程序集等于磁盘上的一个物理文件-多文件程序集(一个程序集,分布在一个以上的文件中)看起来是一个相当奇怪的情况。在过去的5年以上的.NET开发中,从未遇到过。

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


1
@marc_s:我认为您的意思是一个多程序集文件。可以通过studio的命令行工具将多个程序集打包在一个文件中,但不能直接通过IDE打包。
Greg D

5
程序集中的一个非常重要的事情是程序集清单中的元数据。清单包含诸如版本,强名,区域性,引用的程序集等信息。在多文件程序集中,dll或exe中仍然只有一个程序集清单,而多个.netmodule文件中则只有MSIL代码。基本上,组装是> net中的最小部署单位
softveda

@marc_s:如果您在答案中加上@Pratik的观点,我将不胜感激,谢谢
Roee Adler 2009年

@rax:完成; @pratik:现在您让我感到困惑:您再次谈论“多文件程序集”,而@GregD提到它确实是一个“多程序集文件”-现在是什么?(正如我所说-我从未遇到过这样的野兽,所以我有点不清楚它是每个文件多个程序集,还是每个程序集多个文件...。)
marc_s

3
“该编译后的代码还将存储在程序集中,并在以后的调用中重新使用。” 这是令人误解和/或不太清楚。程序集中没有“存储”已编译的代码。我认为您可能是指每个方法/函数在首次调用时都“引用”到本机代码的方式。然后,当程序集在内存中时,将调用该方法的本机代码版本。如果程序集已卸载,然后又重新加载,则jit过程将再次发生。当然,这假定您没有使用NGEN将程序集预编译为本机代码(不建议)。
Ash Ash

13

.NET程序集

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


7

http://www.codeguru.com/columns/csharp_learning/article.php/c5845

程序集是一个文件,在成功编译每个.NET应用程序后,编译器会自动生成该文件。它可以是动态链接库或可执行文件。它仅对应用程序生成一次,并且在每次后续编译时都会更新程序集。


2
程序集与包含它们的文件不同。
格雷格D

1
@Raghav-出于天意,用一些随意的东西来更新您的照片!我们不打算在这里摆弄护照,你知道的!
TheFlash

3

是.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代码本
机数据


该链接将我带到了哪里?无限重定向!经过几次重定向后,我进入了显示此内容的页面。也没有办法使您发布的URL原始。
–Sнаđошƒа1:

2

答案是为了立即抓住。

简而言之,它是包含类和其他文件(如果有)的已编译项目。也就是说,解决方案中的每个项目都是Assembly

或更严格地说,

一个组件是其中类型被存储在flesystem。程序集是一种用于部署代码的机制。例如,System.Data.dll 程序集包含用于管理数据的类型。要在其他程序集中使用类型,必须引用它们。- 来源

我们怎么知道呢?如果您查看解决方案下的项目属性,则可以看到以下图像。

编译项目时,结果为DLLEXE

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明


1

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



0

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


-1

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


编写程序(项目)的源代码后,将创建一个文件,该文件可能是DLL或EXE取决于您的项目 -编写源代码后?关于何时创建该文件似乎不是一个很好的指示,考虑到问题,哪个BTW无关紧要。
Sнаđошƒаӽ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.