C# 或 .NET 中的程序集到底是啥?
Posted
技术标签:
【中文标题】C# 或 .NET 中的程序集到底是啥?【英文标题】:What exactly is an Assembly in C# or .NET?C# 或 .NET 中的程序集到底是什么? 【发布时间】:2010-11-24 15:17:22 【问题描述】:您能否解释一下什么是 C# 或 .NET 中的程序集?
-
它从哪里开始,又在哪里结束?
关于程序集,我应该了解哪些重要信息?
【问题讨论】:
严格来说,程序集不是.NET概念而不是C#概念吗? @JeffH:当我问这个问题时,我认为这是一个 C# 概念。现在我知道它是一个.NET 的。尽管如此,由于我认为其他人可能会像我一样感到困惑,所以我故意没有为谷歌更改它以适应这个错误...... 这也是一个 C# 概念。您必须了解它才能正确使用“内部”访问修饰符。 我的一粒盐:***.com/a/54803483/7389293 【参考方案1】:程序集是代码的编译输出,通常是 DLL,但您的 EXE 也是程序集。它是任何 .NET 项目的最小部署单元。
程序集通常包含 MSIL(Microsoft 中间语言)中的 .NET 代码,在给定机器上第一次执行时,这些代码将被编译为本机代码(“JITted” - 由即时编译器编译)。编译后的代码也将存储在程序集中并在后续调用中重用。
程序集还可以包含图标、位图、字符串表等资源。此外,程序集还包含程序集清单中的元数据 - 版本号、强名称、文化、引用的程序集等信息。
在 99% 的情况下,一个程序集等于磁盘上的一个物理文件 - 多文件程序集(一个程序集,分布在多个文件中)的情况似乎是一个相当奇怪的边缘情况,它在我 5 年多的 .NET 开发中,到目前为止我从未遇到过。
在多文件程序集中,DLL 或 EXE 中仍然只有一个程序集清单,而 MSIL 代码在多个网络模块文件中。
【讨论】:
@marc_s:我认为您的意思是多程序集文件。可以通过 studio 的命令行工具将多个程序集打包到一个文件中,但不能直接通过 IDE。 程序集中的一个非常重要的东西是程序集清单中的元数据。清单包含版本、强名称、文化、引用的程序集等信息。在多文件程序集中,dll 或 exe 中仍然只有一个程序集清单,而 MSIL 代码在多个 .netmodule 文件中。基本上,程序集是 >net 中的最小部署单元 @marc_s:如果您将@Pratik 的观点添加到答案中,我将不胜感激,谢谢 @rax:完成; @pratik:现在您让我感到困惑:您再次谈论“多文件程序集”,而@GregD 提到它确实是“多程序集文件”-现在是什么? (正如我所说 - 我从来没有遇到过这样的野兽,所以我有点不清楚是每个文件多个程序集,还是每个程序集多个文件......) "编译后的代码也将存储在程序集中,并在后续调用中重用。"这是误导和/或不是很清楚。没有编译的代码“存储”在程序集中。我认为您可能指的是每个方法/函数在第一次调用时被“jitted”为本机代码的方式。然后,当程序集在内存中时,调用该方法的本机代码版本。如果程序集被卸载,然后重新加载,jit 过程将再次发生。当然,这假设您没有使用 NGEN 将程序集预编译为本机代码(不推荐)。【参考方案2】:.NET assembly
在 Microsoft .NET 框架中,一个 程序集是部分编译的代码 用于部署的库, 版本控制和安全性。
【讨论】:
【参考方案3】:http://www.codeguru.com/columns/csharp_learning/article.php/c5845
程序集是编译器在成功编译每个 .NET 应用程序后自动生成的文件。它可以是动态链接库或可执行文件。它只为应用程序生成一次,并且在每次后续编译时都会更新程序集。
【讨论】:
程序集不同于包含它们的文件。 @Raghav - 看在老天的份上,用休闲的东西更新你的照片!你知道,我们不是在这里冒充护照!【参考方案4】:答案是为了立即掌握。
简单地说,它是包含您的类和附加文件(如果有)的编译项目。也就是说,一个项目中的每个项目 解决方案是组装。
或者更专业地说,
程序集是文件系统中存储类型的地方。组件是 一种部署代码的机制。例如,
System.Data.dll
程序集包含用于管理数据的类型。在其他中使用类型 程序集,它们必须被引用。 - Source
我们是怎么知道的?如果您查看 solution 下的 project 属性,您会看到以下图像。
当你编译项目时,它变成了 DLL 或 EXE。
【讨论】:
有没有办法从 IDE 中找到实际的程序集文件?我知道它可以从 Windows 资源管理器中找到,在项目内的 bin 文件夹中,但这是查找文件的不切实际的方法。 @carloswm85 为什么不直接右键单击并喜欢它的文件夹? i.stack.imgur.com/RzsRB.png 不是我正在寻找的解决方案。我不想访问 Windows 资源管理器。不过,我找到了解决方案。从 VS19 内部:在Solution Explorer
中单击 Show All Files
菜单按钮,然后将出现 bin
文件夹(和其他文件夹)。打开debug
文件夹,右键单击所需的程序集,然后单击Copy Path
。【参考方案5】:
Here's .NET 程序集组成的另一种解释,一个迷你引用:
.NET 框架由 模块、程序集的概念,其中 存储元数据和清单 信息。一个程序集可以包含 多个模块。仅适用于 Visual C# 创建一个打开的模块 由 C# 编译器编译成程序集 (csc.exe),但程序集可以链接 许多 .NET 模块通过 程序集链接器 (al.exe) 命令行 工具。例如,您的每个来源 代码 .cs 文件可以编译成 一个模块并链接在一起形成 一个装配体——一个装配体只是一个 模块和资源的集合。 但是,这些模块之一;必须 包含清单元数据(见下文) 大会信息 被 CLR 理解。 .... 创建了新的 .exe 或 .dll 在 VS.NET 中,您会看到您的文件出现 在您的 bin 文件夹中。打开它 记事本会发出乱码,或 即使在十六进制编辑器中 在不知道结构的情况下 文件,你需要一个像 ildasm.exe 这样的工具 或 CFF explorer 从 它。组件的结构是 如下:
PE 标头 CLR 标头 CLR 元数据 CLR IL代码 原生数据
【讨论】:
那个链接把我带到了哪里?一种无限重定向!经过几次重定向后,我进入了一个显示this 的页面。也无法获取您发布的原始网址。【参考方案6】:当源代码由语言编译器编译时,它会生成托管程序集和 MSIL(MisroSoft 中间语言)。该程序集包含 .dll 或 .exe 文件。一个Assebmly可以有Private Assembly和Shared Assembly两种,共享Assembly存储在GAC(Global Assembly Cache)中,这样任何应用程序都可以私有程序集存储在应用程序文件夹中,只能由一个应用程序使用。
【讨论】:
【参考方案7】:程序集是在您发布或编译应用程序时创建的 DLL 或 EXE。
【讨论】:
【参考方案8】:在编写程序(项目)的源代码后,将创建一个文件,该文件可能是 DLL 或 EXE,具体取决于您的项目。它只为一个项目制作一次。它有两种类型 1:- 单 2:- 共享或多程序 单个程序集仅在单个程序中使用,而共享时可用于多程序
【讨论】:
在编写程序(项目)的源代码后,会创建一个文件,该文件可能是 DLL 或 EXE,取决于您的项目 - 编写源代码后?对于何时创建该文件似乎不是一个很好的指示,顺便说一句,考虑到问题是无关紧要的。【参考方案9】:程序集是逻辑单元的集合。逻辑单元是指使用 .Net 框架构建和部署应用程序所需的类型和资源。基本上,Assembly 是 Exe 和 DLL 的集合。它是可移植的和可执行的。
【讨论】:
以上是关于C# 或 .NET 中的程序集到底是啥?的主要内容,如果未能解决你的问题,请参考以下文章
C# asp.net - 找不到类型或命名空间名称“Helper”(您是不是缺少 using 指令或程序集引用?)
命名空间“系统”中不存在类型或命名空间名称“事务”(您是不是缺少程序集引用?) - C# ASP.NET