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

Pro*_*gga 23 c# assemblies internal

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

namespace Engine.Entity
Run Code Online (Sandbox Code Playgroud)

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

dth*_*rpe 22

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

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

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

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

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

  • “程序集基本上是一个 DLL 或 EXE。” 确实如此,但有时它可以是任何类型的文件(jpeg、文本文件等)或同时是多个文件。但这是极端情况(请参阅我在这篇文章中的回答)。 (2认同)

Jer*_*ers 7

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

我通常用这个词来解释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 解释了这个概念namespace并且internal非常好,所以我不会详细介绍这些概念.

--jeroen