【问题标题】:C# assemblies, whats in an assembly?C# 程序集,程序集中有什么?
【发布时间】:2011-05-25 17:24:11
【问题描述】:

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

namespace Engine.Entity

有问题的变量是在该命名空间内的一个类中定义的,因此我假设如果我将其设为内部,则只有该命名空间内的对象才能访问它。我将程序集和命名空间视为一体,我认为这是不对的。

【问题讨论】:

  • 看看“.Net Reflector”程序。它会让你打开一个程序集,看看里面有什么。您会看到一个程序集可以包含多个命名空间。

标签: c# assemblies internal


【解决方案1】:

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

程序集基本上只是一个 DLL 或 EXE 文件。它包含描述该 DLL 或 EXE 中代码的 IL 代码和类型信息。它也可以包含许多其他内容,但对于初学者来说,只需将其视为 DLL。

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

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

Internal 修饰符意味着只能从同一程序集中访问该符号。只有编译到与您的代码相同的 DLL 中的代码才能访问带有 internal 标记的属性或方法。

【讨论】:

  • "程序集基本上是一个 DLL 或 EXE。"没错,但有时它可以是任何类型的文件(jpeg、文本文件等)或同时是多个文件。这是边缘情况(请参阅我在这篇文章中的回答)。
  • 是的,一个程序集可以/包含一大堆东西。与此问题的级别无关。
  • 所以一个程序集是按项目分组的吧?因此,如果我在解决方案中有项目,该项目将生成程序集 dll 或 exe
  • 如果我理解正确,程序集是一个特定项目 (.csproj) 的产物,这意味着“内部成员只能在同一程序集中的文件中访问”的官方定义可以改写为“ (...) 在同一个项目中”。
【解决方案2】:

人们很容易对命名空间/程序集感到困惑,因为它解耦了代码物理位置(程序集)和如何引用它的概念(逻辑引用是使用命名空间,物理引用是引用组装)。

我通常用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 Thorpeexplainednamespaceinternal 的概念真的很好,所以我就不细说了。

--杰罗恩

【讨论】:

    【解决方案3】:

    来自internal (C# Reference)

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

    所以这意味着来自同一个程序集/dll,而不是namespace

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-27
          • 2013-08-04
          • 2012-05-07
          • 2013-03-02
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 2020-09-18
          相关资源
          最近更新 更多