C#程序集,什么是程序集?

我正在尝试理解C#中的内部访问修饰符。 我似乎无法理解assembly是什么,以及我的程序的哪个部分保存在该assembly中。 我试图使它变量只能由以下命名空间中的对象访问:

namespace Engine.Entity 

有问题的变量是在该命名空间内的类中定义的,所以我假设如果我将其设置为内部,那么只有该命名空间内的对象才能访问它。 我看到程序集和命名空间是一体的,我认为这是对的。

命名空间仅影响名称解析。 命名空间不暗示任何类型的存储,命名空间也不确定哪些DLL包含您的代码。 命名空间允许您在逻辑名称下将相关事物组合在一起,即使它们可能实际驻留在不同的DLL中。

程序集基本上只是一个DLL或EXE文件。 它包含描述该DLL或EXE中的代码的IL代码和类型信息。 它也可以包含很多其他东西,但对于初学者来说只是把它想象成一个DLL。

通过将代码编译为生成DLL或EXE的项目(csproj),可以将代码放入特定的程序集中。

命名空间可以跨多个程序集。 也就是说,作为该逻辑命名空间的成员的类可以驻留在多个DLL中。 仅当项目引用包含该类的正确程序集(DLL)时,才能访问源代码中的特定类。

“内部”修改器表示只能在同一个程序集中访问该符号。 只有与代码编译到同一DLL中的代码才能访问标记为internal的属性或方法。

人们很容易被命名空间/汇编事物搞糊涂,因为它解耦了代码物理位置(汇编)的位置以及引用它的方式(逻辑上引用是通过使用命名空间和物理引用是通过引用程序集)。

我通常使用contribute这个词解释这个:

  1. 程序集可以为多个名称空间做出贡献
    例如, System.Data.dll程序集有助于命名空间,如System.Data (例如类System.Data.DataTable )和Microsoft.SqlServer.Server (例如类Microsoft.SqlServer.Server.SqlContext )。

  2. 多个程序集可以贡献单个名称空间
    例如, System.Data.dll程序集和System.Xml.dll程序集都对System.Xml命名空间有贡献。
    这意味着如果您使用项目中的System.Xml.XmlDataDocument类,则需要引用System.Data.dll程序集。
    如果您使用System.Xml.XmlDocument类,则需要从项目中引用System.Xml.dll

(上面的示例是.NET 4.0,但也可能适用于以前的.NET版本)。

Danny Thorpe非常好地解释了namespaceinternal的概念,所以我不会详细介绍它们。

–jeroen

来自内部(C#参考)

internal关键字是类型和类型成员的访问修饰符。 内部类型或成员只能在同一程序集中的文件中访问

所以这意味着来自同一个程序集/ dll,而不是命名空间 。

基本上,您不能仅在给定的命名空间内使变量可见。 任何人都可以定义任何命名空间,这会使internal空虚的想法:你只需要编写

 namespace System { public static MySystemInternalSpy { public static void SpyInternals() { ... } } } 

例如,可以访问在System命名空间中定义为internal任何变量,类或方法。

命名空间和程序集不是同义词。 命名空间通常跨越多个程序集。 从Visual Studio构建的任何托管代码都有一对一的项目与DLL / EXE二进制文件的程序集相对应。

但是,如果将托管代码与命令行链接,则可以创建一个程序集,其中多个项目文件都属于一个程序集(这意味着磁盘上的多个文件一起代表一个程序集)。 但更别提这种情况,这是一种从未在实践中发生过的深奥的事情。

“内部”访问修饰符只是意味着只能从该程序集中访问目标。 它与命名空间无关。