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。
假设还要写一个名为 MyWidgets 的程序,而且想使用 SquareWidget 类。在代码中没有声明类 SquareWidget,使用的是定义在 SuperLib 中的类。在编译程序时,需要给编译器添加该引用。
在 Rider 中,右键项目,选择“添加” -> “引用”,选择下方的“添加自”按钮,找到对应的程序集即可。
添加引用后,即可编译 MyWidgets。
mscorlib 库
有一个类库,几乎先前的每个示例中都使用了它,即包含 Console 类的类库。该类库被定义在 mscorlib 程序集中的 mscorlib.dll 文件里。mscorlib 包含 C# 类型及大部分 .NET 语言基本类型的定义,在编译时,它必须被引用,因此不显示放在引用目录中。
因此,算上 mscorlib,图 22.3 的过程看起来更像是图 22.4 描述的那样。
潜在的问题
若想扩展上述类的能力,使用名为 CircleWidget 的类,并将其定义在 UltraLib 的程序集中。MyWidgets 的源代码如下,创建一个 SquareWidget 对象和一个 CircleWidget 对象,分别定义在 SuperLib 和 UltraLib 中。
类库 UltraLib 的源代码如下所示,并将 UltraLib 编译成 dll,加入到项目引用列表中。注意,除了 CircleWidget 类外,还声明了一个名为 SquareWidget 的类。
由于两个库都含有名为 SquareWidget 的类,编译时会产生错误信息,因为编译器不知道使用 SquareWidget 类的哪个版本。
22.2 命名空间
- 命名空间可视为一个字符串,加在类名或类型名前面,通过点分隔。
- 命名空间名、分隔点、类名三者共同组成类的完全限定名。
- 命名空间是共享命名空间名的一组类和类型。
使用命名空间将一组类型组织在一起并命名。
例如,创建 MyCorp.SuperLib 命名空间并在其中声明 SquareWidget 类。
当 MyCorp 公司提供更新的程序集时,可以按照如下方式修改。
如果 UltraLib 程序集也被使用,那么编译过程下。
22.2.1 命名空间名称
- 命名空间名称可以是任何有效标识符,区分大小写。
- 命名空间名称可以包含任意数量的句点符号,用于将层次化组织类型。
使用命名空间要点如下:
- 以公司名称开头。
- 在公司名之后跟着技术名称。
- 不要与类或类型名称相同。
22.2.2 命名空间的补充
- 命名空间内,每个类型名必须有别于所有其他类型。
- 命名空间内的类型称为命名空间的成员。
- 源文件可以包含任意树木的命名空间声明,可以顺序也可以嵌套。
22.2.3 命名空间跨文件伸展
命名空间是非封闭的,可以在源文件后面或其他源文件中使用。
22.2.4 嵌套命名空间
-
文本嵌套
将命名空间的声明放在一个命名空间声明体内部。
-
分离的声明
为嵌套命名空间创建单独的声明,但必须在声明中使用完全限定名。
22.3 using 指令
using 指令包含 2 大作用:
- using 命名空间指令。
- using 别名指令。
关于 using 指令的要点如下:
- 必须放在源文件的顶端,在任何类型声明之前。
- 应用于当前源文件中的所有命名空间。
22.3.1 using 命名空间指令
通过在源文件顶端放置 using 命名空间指令以避免使用长名称。
下面的代码使用 using 命名空间指令来描述该代码来自 System 命名空间的类或其他类型。
22.3.2 using 别名指令
using 别名指令允许起一个别名给:
- 命名空间。
- 命名空间捏的一个类型。
- 前两行告诉编译器,Syst 是 命名空间 System 的别名,SC 是类 System.Consle 的别名。
- Main 的第一条语句使用命名空间 System 的别名,第二条语句使用完全限定名,第三条语句使用类的别名。
22.3.3 using static 指令
使用 using static 指令引用给定命名空间中的特定类、结构体或枚举,以不带任何前缀地进行访问。
using static 指令指定的类本身可以不是静态的,类中非静态类型成员不会被 using static 指令导入。
22.4 程序集的结构
程序集本身不包含本地机器代码,而是包含公共中间语言代码。此外,还包含即时编译器(JIT),在运行时将 CIL 转换为本机代码所需要的一切信息。程序集的文件扩展名通常为 .exe 或 .dll。
单文件程序集
大部分程序集由一个单独的文件构成:
-
程序集清单。
- 程序集标识符。
- 组成程序集的文件列表。
- 一个指示程序集中内容在哪里的地图。
- 关于引用的其他程序集的信息。
-
类型元数据。
包含程序集中定义的所有类型的信息。
-
CIL 中间代码。
-
资源部分。
该部分可选。可以包含图形或语言资源。
多文件程序集
程序集代码文件称为模块。尽管大部分程序集由单个文件构成,但有些程序集含有多个文件。对于有多个模块的程序集,一个文件是主模块,其他为次要模块。
- 主模块含有程序集的清单和次要模块的引用。
- 次要模块的文件名以扩展名 .netmodule 结尾。
- 多文件程序集被视为一个单元,一起部署并一起定版。
22.5 程序集标识符
在 .NET 框架中,程序集的文件名相对不重要,更重要的是程序集的标识符,其包含 4 个组成部分:
-
简单名称。
不带文件扩展名的文件名,也称为程序集名或友好名称。
-
版本号。
形式为 MajorVersion.MinorVersion.Build.Revision,例如:2.0.35.9。
-
文化信息。
一个由 2 ~ 5 个字符组成的字符串,代表一种语言、国家或地区。例如,没过使用的英语文化名是 en-US,德国使用的德语文化是de-DE。
-
公钥。
由程序集公司生产的唯一字符串(128 字节)。
22.6 强命名程序集(*)
22.7 私有程序集的部署(*)
22.8 共享程序集和 GAC(*)
22.9 配置文件(*)
22.10 延迟签名(*)
相关文章:
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 强命名…...
【Maven】008-Maven 私服搭建与使用
【Maven】008-Maven 私服搭建与使用 文章目录 【Maven】008-Maven 私服搭建与使用一、概述1、简介2、建立私服后依赖查找和下载逻辑第一步:请求本地仓库第二步:请求 Maven 私服第三步:请求外部远程仓库(远程中央仓库等)…...
TMDB电影数据分析(下)
TMDB电影数据分析(下) 本文对源自Kaggle TMDB电影数据集进行分析影响电影票房的因素,数据分析流程包含数据集概分析、数据清洗、数据统计以及分析影响电影票房的因素。影响票房因素可能是电影预算、电影类型、电影时长、受欢迎程度、电影评分…...
django后台手机号加密存储
需求: 1 :员工在填写用户的手机号时,直接填写,在django后台中输入 2:当员工在后台确认要存储到数据库时,后台将会把手机号进行加密存储,当数据库被黑之后,手机号字段为加密字符 3&am…...
三、Qt Creator 使用
关于Qt的安装及环境配置,在我的上一篇《二、QT下载、安装及问题解决(windows系统)》已经讲过了。 本章节有一个重点,在新建 工程文件时,所在路径不要有中文,否则编译及运行程序不能正常运行。 在使用Qt Creator(以下…...
css 边框渐变
需求: 普通的div 边框不好看,做一个渐变色 进程: 最简单的当然是做一个内部是白色的边框是渐变色的图,然后使用 background: url("back.jpg"),这样看起来就像是做了一个渐变的边框如果做不了图࿰…...
SofaMQ一些常用的API
SofaMQ的十五种常用的API 引言 SofaMQ作为阿里巴巴开源的消息中间件,提供了丰富的API以支持各种消息传递场景。在本文中,我们将介绍SofaMQ的十五种常用API,并通过实例演示其用法。 1. Producer相关API 1.1 SofaMQProducer SofaMQProduce…...
IIS 缓存, 更新后前端资源不能更新问题
解决办法: 通常只需要index.html 不缓存即可, 其他文件都是根据index.html 中的引用去加载; 正确的做法是在 站点下增加 web.config 文件, 内容如下: 我这个是因为目录下有个config.js 配置文件, 也不能缓存, 所以加了两个 <?xml version"1.0" encoding&quo…...
中科院罗小舟团队提出 UniKP 框架,大模型 + 机器学习高精度预测酶动力学参数
作者:李宝珠 编辑:三羊 中国科学院深圳先进技术研究院罗小舟团队提出了,基于酶动力学参数预测框架 (UniKP),实现多种不同的酶动力学参数的预测。 众所周知,生物体内的新陈代谢是通过各种各样的化学反应来实现的。这…...
组件中写选项的顺序(vue的问题)
为什么选项要有统一的书写顺序呢?很简单,就是要将选择和认知成本最小化。 副作用 (触发组件外的影响) el全局感知 (要求组件以外的知识) nameparent组件类型 (更改组件的类型) functional模板修改器 (改变模板的编译方式) delimiterscomments模板依赖 (…...
LUA 对象转excel
1. 首先把LUA 转成JSON 对象 因为是excel, 所以第一层要是数组,否则没有什么意义,即lua对象要是一个数组比较合理。这里使用开源的json.lua, 但是开源的,对于数字作下标的,或者是一个数组里,不同类型的key…...
深入理解 Flink(八)Flink Task 部署初始化和启动详解
JobMaster 部署 Task 核心入口: JobMaster.onStart();部署 Task 链条:JobMaster --> DefaultScheduler --> SchedulingStrategy --> ExecutionVertex --> Execution --> RPC请求 --> TaskExecutor TaskExecutor 处理 JobMaster 的 …...
openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c
文章目录 openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c概述笔记END openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramfromdata.c 概述 开源工程包含的头文件类型是.inc, 要重命名为.h, 否则没有c头文件语法提示 从数组中载入大数p,q,g 建立ossl…...
【k8s】Kubernetes技术和相关命令简介
一、 Kubernetes简介 Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。kubernetes,简称K8s࿰…...
清晰光谱空间:全自动可调波长系统的高光谱成像优势
高光谱成像技术 高光谱成像技术是一种捕获和分析宽波长信息的技术,能够对材料和特征进行详细的光谱分析和识别。高光谱成像技术的实现通过高光谱相机,其工作原理是使用多个光学传感器或光学滤波器分离不同波长的光,并捕获每个波段的图像&…...
23.实战演练--个人主页
<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"true"an…...
[剪藏] - 任泽平年终演讲精华:点燃希望——2024中国经济十大预测
任泽平年终演讲精华:点燃希望——2024中国经济十大预测 泽平宏观 2023-12-23 08:01 发表于上海 12月22日22:30,任泽平年终秀“点燃希望乐观者前行——2024中国经济十大预测”圆满收官。 泽平宏观、北京广播电视台、上海高净值研究院、北京时间等携手打…...
基于LabVIEW的压力传感器测试系统
摘要 现在各类压力传感器已广泛应用于各种工业自控环境,对压力传感器的研究 及应用,既可以体现一个国家的科技发展水平,又可以提升国家的综合国力,还 可以在丰富、方便和智能化人们的生活方面做出重要的贡献。而针对不同仪器组 成…...
Vue 如何使用WebSocket与服务器建立链接 持续保持通信
WebSocket 浏览器通过JavaScript向服务器发出建立WebSocket链接的请求,链接建立后,客户端和服务器端就可以通过TCP链接直接交互数据。WebSocket链接后可以通过send()方法来向服务器发送数据,并通过onnessage事件来接受服务器返回的数据。 创…...
自动驾驶模拟器
目录 Carla 自动驾驶模拟器 Udacity自动驾驶模拟器 Carla 自动驾驶模拟器 pip install carla 需要下载地图 Udacity自动驾驶模拟器...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
