C# 图解教程 第5版 —— 第22章 命名空间和程序集

文章目录

    • 22.1 引用其他程序集
    • 22.2 命名空间
      • 22.2.1 命名空间名称
      • 22.2.2 命名空间的补充
      • 22.2.3 命名空间跨文件伸展
      • 22.2.4 嵌套命名空间
    • 22.3 using 指令
      • 22.3.1 using 命名空间指令
      • 22.3.2 using 别名指令
      • 22.3.3 using static 指令
    • 22.4 程序集的结构
    • 22.5 程序集标识符
    • 22.6 强命名程序集(*)
    • 22.7 私有程序集的部署(*)
    • 22.8 共享程序集和 GAC(*)
    • 22.9 配置文件(*)
    • 22.10 延迟签名(*)

22.1 引用其他程序集

​ 在许多项目中,会使用其他程序集的类或类型,而不仅仅是自己声明的。这些程序集(称为类库)可能来自 BCL 或第三方供应商,也可以是自己创建的。通常这些程序集文件的名称以 .dll 扩展名结尾,而不是 .exe。

image-20240112104716131 image-20240112104630330
图22.1 SuperLib 源代码和结果程序集

​ 假设还要写一个名为 MyWidgets 的程序,而且想使用 SquareWidget 类。在代码中没有声明类 SquareWidget,使用的是定义在 SuperLib 中的类。在编译程序时,需要给编译器添加该引用。

image-20240112104937515

​ 在 Rider 中,右键项目,选择“添加” -> “引用”,选择下方的“添加自”按钮,找到对应的程序集即可。

image-20240112105453161 image-20240112105603092
图22.2 Rider 中添加程序集

​ 添加引用后,即可编译 MyWidgets。

image-20240112105753187
图22.3 引用另一个程序集

mscorlib 库

​ 有一个类库,几乎先前的每个示例中都使用了它,即包含 Console 类的类库。该类库被定义在 mscorlib 程序集中的 mscorlib.dll 文件里。mscorlib 包含 C# 类型及大部分 .NET 语言基本类型的定义,在编译时,它必须被引用,因此不显示放在引用目录中。

​ 因此,算上 mscorlib,图 22.3 的过程看起来更像是图 22.4 描述的那样。

image-20240112110057102
图22.4 引用类库

潜在的问题

​ 若想扩展上述类的能力,使用名为 CircleWidget 的类,并将其定义在 UltraLib 的程序集中。MyWidgets 的源代码如下,创建一个 SquareWidget 对象和一个 CircleWidget 对象,分别定义在 SuperLib 和 UltraLib 中。

image-20240112110502799

​ 类库 UltraLib 的源代码如下所示,并将 UltraLib 编译成 dll,加入到项目引用列表中。注意,除了 CircleWidget 类外,还声明了一个名为 SquareWidget 的类。

image-20240112110702481

​ 由于两个库都含有名为 SquareWidget 的类,编译时会产生错误信息,因为编译器不知道使用 SquareWidget 类的哪个版本。

image-20240112111012114
图22.5 由于程序集 SuperLib 和 UltraLib 都含有名为 SquareWidget 的类声明,编译器不知道该实例化哪一个

22.2 命名空间

  • 命名空间可视为一个字符串,加在类名或类型名前面,通过点分隔。
  • 命名空间名、分隔点、类名三者共同组成类的完全限定名
  • 命名空间是共享命名空间名的一组类和类型。
image-20240112151644643
图22.6 命名空间是共享同一命名空间名的一组类型定义

​ 使用命名空间将一组类型组织在一起并命名。

image-20240112151816672

​ 例如,创建 MyCorp.SuperLib 命名空间并在其中声明 SquareWidget 类。

image-20240112152123128

​ 当 MyCorp 公司提供更新的程序集时,可以按照如下方式修改。

image-20240112152209194

​ 如果 UltraLib 程序集也被使用,那么编译过程下。

image-20240112152254624
图22.7 带命名空间的类库

22.2.1 命名空间名称

  • 命名空间名称可以是任何有效标识符,区分大小写。
  • 命名空间名称可以包含任意数量的句点符号,用于将层次化组织类型。
表22.1 来自 BCL 的命名空间示例
image-20240112152501201

​ 使用命名空间要点如下:

  1. 以公司名称开头。
  2. 在公司名之后跟着技术名称。
  3. 不要与类或类型名称相同。

22.2.2 命名空间的补充

  • 命名空间内,每个类型名必须有别于所有其他类型。
  • 命名空间内的类型称为命名空间的成员。
  • 源文件可以包含任意树木的命名空间声明,可以顺序也可以嵌套。
image-20240112152744401
图22.8 一个源文件中的多个命名空间

22.2.3 命名空间跨文件伸展

​ 命名空间是非封闭的,可以在源文件后面或其他源文件中使用。

image-20240112152909337 image-20240112153030894
图22.9 命名空间可以跨源文件并编译成单个程序集

22.2.4 嵌套命名空间

  1. 文本嵌套

    将命名空间的声明放在一个命名空间声明体内部。

  2. 分离的声明

    为嵌套命名空间创建单独的声明,但必须在声明中使用完全限定名。

image-20240112153510335 image-20240112153558282
图22.10 声明嵌套命名空间的两种形式是等价的

22.3 using 指令

​ using 指令包含 2 大作用:

  1. using 命名空间指令。
  2. using 别名指令。

​ 关于 using 指令的要点如下:

  • 必须放在源文件的顶端,在任何类型声明之前。
  • 应用于当前源文件中的所有命名空间。

22.3.1 using 命名空间指令

​ 通过在源文件顶端放置 using 命名空间指令以避免使用长名称。

image-20240112154615000

​ 下面的代码使用 using 命名空间指令来描述该代码来自 System 命名空间的类或其他类型。

image-20240112154634804

22.3.2 using 别名指令

image-20240112154913312

​ using 别名指令允许起一个别名给:

  1. 命名空间。
  2. 命名空间捏的一个类型。
image-20240112155352194
  • 前两行告诉编译器,Syst 是 命名空间 System 的别名,SC 是类 System.Consle 的别名。
  • Main 的第一条语句使用命名空间 System 的别名,第二条语句使用完全限定名,第三条语句使用类的别名。

22.3.3 using static 指令

​ 使用 using static 指令引用给定命名空间中的特定类、结构体或枚举,以不带任何前缀地进行访问。

image-20240112155555697

​ using static 指令指定的类本身可以不是静态的,类中非静态类型成员不会被 using static 指令导入。

22.4 程序集的结构

​ 程序集本身不包含本地机器代码,而是包含公共中间语言代码。此外,还包含即时编译器(JIT),在运行时将 CIL 转换为本机代码所需要的一切信息。程序集的文件扩展名通常为 .exe 或 .dll。

单文件程序集

​ 大部分程序集由一个单独的文件构成:

  1. 程序集清单。

    • 程序集标识符。
    • 组成程序集的文件列表。
    • 一个指示程序集中内容在哪里的地图。
    • 关于引用的其他程序集的信息。
  2. 类型元数据。

    包含程序集中定义的所有类型的信息。

  3. CIL 中间代码。

  4. 资源部分。

    该部分可选。可以包含图形或语言资源。

image-20240112161415922
图22.11 单文件程序集的结构

多文件程序集

​ 程序集代码文件称为模块。尽管大部分程序集由单个文件构成,但有些程序集含有多个文件。对于有多个模块的程序集,一个文件是主模块,其他为次要模块。

  • 主模块含有程序集的清单和次要模块的引用。
  • 次要模块的文件名以扩展名 .netmodule 结尾。
  • 多文件程序集被视为一个单元,一起部署并一起定版。
image-20240112161836105
图22.12 多文件程序集

22.5 程序集标识符

​ 在 .NET 框架中,程序集的文件名相对不重要,更重要的是程序集的标识符,其包含 4 个组成部分:

  1. 简单名称。

    不带文件扩展名的文件名,也称为程序集名友好名称

  2. 版本号。

    形式为 MajorVersion.MinorVersion.Build.Revision,例如:2.0.35.9。

  3. 文化信息。

    一个由 2 ~ 5 个字符组成的字符串,代表一种语言、国家或地区。例如,没过使用的英语文化名是 en-US,德国使用的德语文化是de-DE。

  4. 公钥。

    由程序集公司生产的唯一字符串(128 字节)。

image-20240112162522780
图22.13 清单中程序集标识符的组成部分
image-20240112162552644
图22.14 关于程序集标识符的术语

22.6 强命名程序集(*)

22.7 私有程序集的部署(*)

22.8 共享程序集和 GAC(*)

22.9 配置文件(*)

22.10 延迟签名(*)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python3.5如何打包编译

python3.5怎么打包编译 问题:用Python开发的小工具有时需要编译打包为Windows(*.exe)、Mac等操作系统下的可执行性文件以供非程序员使用。 解决方案: 一、py2exe 目前只支持到Python3.4,暂不支持Python3.5 二、PyInstaller 安装&#x…

【MATLAB】小波_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波-LSTM神经网络时序预测算法是一种结合了小波变换和长短期记忆神经网络(LSTM)的时间序列预测方法。 小波变换是一种信号处理方法,能够将信号分解为…

2024年1月6日~2024年1月12日周报

目录 一、前言 二、SeisInvNet-2020 三、RTM研究 四、遇到的问题及解决 4.1 KeyError: data 4.2 将mat文件转换为npy文件 五、小结 5.1 存在的问题及疑惑 5.2 下周安排 一、前言 本周的主要安排是阅读论文查看一些好的点子。 但是想法总是美好的,之前答应的…

叠加文件夹内所有png文件 python

→ import os import cv2 import matplotlib.pyplot as pltPATH "./1" #文件路径 i 0 #子文件夹路径 img10 for parent, dirs, files in os.walk(PATH):for file in files:if not file.endswith(.png):continueimg cv2.imread(os.path.join(parent, file))if i0:i…

【Linux驱动】platform 设备驱动分离(一)—— 驱动分层及相关API

以目前为止的逻辑,无论是获取设备属性信息,还是实现驱动逻辑,都是放在一个驱动模块中。在没有设备树的情况下,如果我们只需要修改设备信息(如寄存器地址),那么我们就需要重新编译整个驱动模块。…

80V 72V 60V 48V 降12V 5V 3.3V 功耗低降压恒压芯片H6603

输入电压80V、72V、60V、48V:这些是电源系统中的不同电压水平,通常用于驱动各种设备。例如,电动汽车、电动自行车或工业设备中的电池系统可能以这些电压级别工作。 降12V:这可能是指一种电源模块,其功能是将输入电压&…

x-cmd pkg | dua - 磁盘使用分析器

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 dua 是 Disk Usage Analyzer 的简写,该工具可以快速查看给定目录的磁盘空间使用情况。 对于想要深入了解磁盘空间使用情况并有效管理存储的用户来说,Dua 是一个很有价值的工具。通过使用 Dua …

自己动手造一个状态机

自己动手造一个状态机 引言有限自动状态机 (FSM)五要素应用场景优势 开源产品造个轮子改造点Looplab fsm示例演示实现解析 改造过程 引言 有限自动状态机 (Finite-state machine , FSM) 通常用来描述某个具有有限个状态的对象,并且在对象的生命周期中组成了一个状态…

Android 13 辅助屏导航栏不显示问题

问题 在Android 13 上开启辅助屏幕。但是发现辅助屏systemui 导航按 icon没有显示,但是点击对应的区域有作用 分析 可以用 anroid device monitor 工具分析视图 解决 public NavigationBarView(Context context, AttributeSet attrs) {super(context, attrs);//add star…

x-cmd pkg | smartctl - 用于监测和分析硬盘的工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 smartctl 是一个用于监测和分析硬盘中 S.M.A.R.T.(自我检测,分析和报告技术)信息的命令行工具,是 Smartmontools 的一部分。通过 smartctl 工具,可以分析各种…

安泰电子前置微小信号放大器怎么用的

前置微小信号放大器是一种重要的电子设备,用于放大微弱的输入信号,提高系统的灵敏度。它在各种领域中都有广泛的应用,包括音频、通信、测量等。在这篇文章中,我们将详细介绍前置微小信号放大器的使用方法,以便更好地理…

Cdd诊断数据控中的zz rc yy

如上图所示的Cdd Candela Diagnostic Descriptions 诊断数据库会话定义中有许多的标识符缩写,如zz rc LL xx 等 其实这些字母没有意义,它们只是唯一地标识对话框中的组合组件。

HDFS概述

文章目录 HDFS背景定义HDFS 优缺点HDFS 组成HDFS文件块大小 HDFS背景定义 背景 先给大家介绍一下什么叫HDFS,我们生活在信息爆炸的时代,随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁…

国内镜像源配置方法(包括临时和永久方法)

国内镜像源: 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/豆瓣 http://pypi.douban.com/simplePython官方 https://pypi.python.org/simple/v2ex http://pypi.v2ex.com/simple/中国科学院 http://pypi.mi…

【IDEA--dubug相关】-- 1. 取消debug的所有断点 2. debug侧边栏消失问题

下面是一些经常在日常debug时用到的场景,方便查看、与君共勉! 文章目录 1. 如何取消所有断点2. debug底部左边侧边栏消失 1. 如何取消所有断点 如图我们可能在项目中给很多代码行添加了断点,一个一个点取消麻烦 在debug运行中点击选中底部…

React Native 桥接组件封装原生组件属性

自定义属性可以让组件具备更多的灵活性,所以有必要在JS 层通过自定义属性动态传值。 一、添加原生组件属性 因为 ViewManager 管理了整个组件的行为,所以要新增组件属性也需要在这里面(如 InfoViewManager)进行定义。 1、在Inf…

[JVM] Java类的加载过程

Java类的加载过程 在Java中,类的加载是指在程序运行时将类的二进制数据加载到内存中,并转化为可以被JVM执行的形式的过程。类的加载过程主要包括以下几个步骤: 加载(Loading):通过类的全限定名,…

【Docker】数据管理之数据卷的挂载

一、什么是数据卷 为了很好的实现数据保存和数据共享,Docker提出了Volume这个概念,简单的说就是绕过默认的联合 文件系统,而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷。数据卷提供了一些有用的特性: 数据卷可以在…

Casper Network (CSPR)2024 年愿景:通过投资促进增长

Casper Network (CSPR)是行业领先的 Layer-1 区块链网络之一,通过推出了一系列值得关注的技术改进和倡议,已经为 2024 年做好了准备。 在过去的一年里,Casper Network (CSPR)不断取得里程碑式的进展,例如推…

设计模式—行为型模式之状态模式

设计模式—行为型模式之状态模式 状态(State)模式:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 状态模式包含以下主要角色: 环境类&am…