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自动驾驶模拟器...
纤维增强复合材料多轴3D打印的神经网络协同优化
1. 纤维增强复合材料与多轴3D打印技术概述纤维增强复合材料(Fiber-Reinforced Composites)因其独特的力学性能组合——高强度、高刚度和低密度,已成为现代工程设计中不可或缺的材料选择。这类材料由高强度纤维(如碳纤维、玻璃纤维…...
脉冲神经网络SNN工程落地全链路指南:从LIF建模到边缘部署
1. 这不是又一本“神经网络入门”——它是一份面向真实研究与工程落地的脉冲神经网络实操手记“Spiking Neural Networks”(SNN)这个词,过去十年里在学术会议海报上出现的频率,几乎和咖啡渍在论文草稿边缘的扩散速度一样快。但如果…...
企业级Agent开发保姆级教程:从入门到交付,看这一篇就够了
一、背景介绍及核心要点企业级Agent开发正在从探索期迅速迈向规模化落地期。2023年Gartner在最新AI成熟度曲线报告中指出,超过68%的全球大型企业已将多Agent协同列入未来3年核心投资清单。首先,Agent已不再是单一对话机器人,而是集成RAG知识库…...
通过 API 实时监听企业微信外部群变更事件并同步本地数据库
能力介绍 在企业微信外部群的协同管理中,群聊的名称修改、群主变更、新成员加入或老成员退群等状态变更,往往无法仅靠主动拉取来感知。该能力通过配置接收事件服务器(Callback),利用标准的 HTTP POST 请求实时接收企微…...
写给前端的 CANN-GraphCompiler:昇腾图编译器到底是啥?
写给前端的 CANN-GraphCompiler:昇腾图编译器到底是啥? 之前有兄弟问:“哥,PyTorch 模型怎么在昇腾上跑?中间有什么编译过程?” 好问题。今天一次说清楚。 GraphCompiler 是啥? GraphCompiler 是…...
我在大厂做开发的5年:那些996的日子
作为一名在互联网大厂摸爬滚打五年的开发工程师,如今转型成为软件测试团队的负责人,回望过去那些被996填满的日子,我有太多话想对同为技术从业者的测试同仁们说。这些经历不仅是我个人的成长印记,更藏着开发与测试岗位在高压环境下…...
福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现
更多请点击: https://kaifayun.com 第一章:福建话TTS落地难?手把手教你绕过ElevenLabs官方未公开的闽东方言/莆仙话语音注入方案,限时可复现 ElevenLabs 官方 API 当前仅支持普通话、粤语等主流中文变体,对闽东方言&a…...
智慧无人机航拍巡检数据集 红外行人车辆识别数据集 行人车辆计数图像识别 红外建筑物识别 夜间低光环境下视觉感知算法 安防、交通等领域红外视觉任务 第10355期
深度学习数据集 README数据集核心信息总览维度详情数据类别目标检测类(建筑物、人们、车辆、路灯、通用物体、单个行人,共 6 类)数据数量图像样本共 60 张,包含训练、验证、测试所需的基础样本量数据集格式图像格式(支…...
洛圣都生存指南:YimMenu开源游戏增强工具与安全防护系统深度解析
洛圣都生存指南:YimMenu开源游戏增强工具与安全防护系统深度解析 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trendi…...
0601光刻机 第六篇:EUV超精密光学系统(S级 长期死磕突破)第1小节:光学物镜核心原理
第六篇:EUV超精密光学系统(S级 长期死磕突破) 第1小节:光学物镜核心原理(硬核无水分,从物理本质到工程实现) 前置硬核声明 EUV物镜是光刻机的“原子级眼睛”,13.5nm波长决定透射方案…...
