C# 程序集和版本控制介绍


.NET学习资料

.NET学习资料

.NET学习资料


在 C# 编程中,程序集和版本控制是构建稳健、可维护应用程序的关键要素。理解它们的工作原理,对于开发高效的.NET 应用程序至关重要。

一、C# 程序集

(一)程序集概念

程序集是.NET 应用程序的基本部署单元,它可以是一个动态链接库(DLL)文件,也可以是一个可执行文件(EXE)。简单来说,程序集就是将代码、资源和元数据组合在一起的一个逻辑单元。在.NET 应用程序中,程序集负责提供类型、资源和实现功能,是应用程序运行的基础。

(二)程序集组成

中间语言代码(IL Code):C# 代码在编译时,会被转换为中间语言代码。这种代码并非机器可直接执行的代码,而是一种与平台无关的字节码,需要在运行时由即时编译器(JIT)进一步编译成机器代码才能执行。这样做的好处是,使得.NET 应用程序具有跨平台的潜力,只要目标平台上有相应的.NET 运行时环境,就能运行程序集。

元数据(Metadata):元数据包含了关于程序集中类型定义、方法签名、属性等描述性信息。这些信息对于.NET 运行时理解和执行程序集中的代码至关重要,同时也为诸如反射(Reflection)等强大的功能提供了支持。通过反射,开发者可以在运行时动态地检查和操作程序集的类型和成员。

清单(Manifest):清单就像是程序集的目录,记录了程序集的版本信息、文化信息、引用的其他程序集等内容。它描述了程序集的内容和依赖关系,确保程序集在运行时能够正确地找到并加载所需的资源和依赖项。

资源(Resources):程序集可以包含各种非代码数据,如图像、文本文件、本地化资源等,这些都被称为资源。资源可以被嵌入到程序集中,也可以作为外部文件与程序集关联。在应用程序中,通过资源可以方便地实现多语言支持、界面定制等功能。

(三)程序集类型

私有程序集:私有程序集仅供单个应用程序使用,通常存放在应用程序的目录中。当一个应用程序需要使用私有程序集的功能时,只需要将该程序集的文件复制到应用程序的相关目录下即可。私有程序集的使用非常简单直接,不需要额外的配置和管理,适合于一些只在特定应用程序中使用的功能模块。

共享程序集:共享程序集可以被多个应用程序共同使用,为了确保其唯一性和版本控制,共享程序集通常需要有一个强名称(Strong Name),并存储在全局程序集缓存(GAC, Global Assembly Cache)中。在 Windows 操作系统中,GAC 的默认位置是%windir%\Microsoft.NET\assembly,在 64 位系统中,GAC 有两个目录:GAC_32用于 32 位程序集,GAC_64用于 64 位程序集。共享程序集适用于一些通用的、稳定的组件,如第三方类库或者.NET Framework 自身的核心组件,通过共享程序集,可以提高代码的重用性和应用程序的整体性能。

二、版本控制

(一)版本号组成

每个程序集都有一个版本号,用于标识程序集的不同版本。版本号通常由四个部分组成:主版本号、次版本号、生成号和修订号,例如:1.0.0.0。

主版本号:当程序集发生重大的、不兼容的变化时,主版本号会递增。例如,对程序集的核心功能进行了重构,或者接口发生了重大改变,这可能会导致使用该程序集的应用程序需要进行相应的修改才能继续正常工作。

次版本号:在主版本号不变的情况下,当程序集有了一些向后兼容的新功能添加时,次版本号会递增。比如,在原有的功能基础上增加了一些新的方法或属性,但这些新的变化不会影响到现有应用程序对该程序集的使用。

生成号:生成号一般与程序集的编译过程相关,每次重新编译程序集时,生成号可以自动递增,用于区分不同的编译版本。它可以帮助开发者跟踪程序集的编译历史和构建过程。

修订号:通常在修复程序集中的一些小错误或者进行一些微小的调整时,修订号会递增。这些修改不会对程序集的功能和接口产生明显的影响,主要是为了修复一些已知的问题或者提高程序集的稳定性。

(二)版本控制的重要性

版本控制对于共享程序集尤为重要,因为它允许不同版本的程序集共存。在一个大型的开发项目中,可能会有多个应用程序依赖于同一个共享程序集,而这些应用程序可能由于各种原因,需要使用不同版本的该程序集。通过版本控制,.NET 运行时能够根据应用程序的需求,正确地加载和使用相应版本的程序集,避免版本冲突和兼容性问题。

(三)强名称程序集与版本控制

强名称程序集是通过使用公钥加密技术签名的程序集,它不仅确保了程序集的唯一性和完整性,也在版本控制中发挥着重要作用。强名称由程序集的名称、版本号、文化信息和公钥标记组成,通过这种方式,可以确保在 GAC 中没有重复的程序集,并且程序集在传输和存储过程中不被篡改。当一个应用程序引用一个强名称程序集时,它可以明确指定需要的版本号,这样在运行时,CLR 会根据指定的版本号在 GAC 中查找并加载相应版本的程序集,从而保证应用程序的稳定性和可靠性。

(四)生成强名称

可以使用.NET SDK 提供的sn.exe工具生成强名称密钥对。例如,使用以下命令生成一个名为MyKey.snk的密钥对文件:

sn -k MyKey.snk

然后,在项目的AssemblyInfo文件中引用该密钥,通过这样的方式,为程序集赋予强名称:

[assembly: AssemblyKeyFile("MyKey.snk")]

(五)全局程序集缓存(GAC)与版本管理

GAC 是一个存储共享程序集的机器范围的存储区,只有具有强名称的程序集才能被安装到 GAC 中。可以使用gacutil.exe工具来安装和卸载程序集,例如:

gacutil -i MyAssembly.dll  // 安装程序集
gacutil -u MyAssembly      // 卸载程序集

在 GAC 中,不同版本的程序集可以同时存在,并且通过版本号进行区分和管理。当应用程序需要使用 GAC 中的程序集时,CLR 会首先在 GAC 中查找该程序集,并根据应用程序所指定的版本号,加载相应版本的程序集。

三、总结

C# 程序集作为.NET 应用程序的核心构建块,负责代码的组织、部署和版本控制。通过合理地使用程序集和版本控制机制,开发者可以实现代码的模块化、重用和安全性,构建出更加健壮、可维护的应用程序。无论是开发小型的桌面应用程序,还是大型的企业级分布式系统,理解和掌握 C# 程序集和版本控制的知识,都是非常必要的。希望通过本文的介绍,能帮助你对 C# 程序集和版本控制有更深入的理解和认识。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章,支持多种AI服务(如OpenAI、百度文心一言、智谱AI等),并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成:根据输入的关键词生成高质量文章。 内容…

Vite 为什么快,是怎么打包的

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

协议-ACLLite-ffmpeg

是什么? FFmpeg是一个开源的多媒体处理工具包,它集成了多种功能,包括音视频的录制、转换和流式传输处理。FFmpeg由一系列的库和工具组成,其中最核心的是libavcodec和libavformat库。 libavcodec是一个领先的音频/视频编解码器库&…

【C++高并发服务器WebServer】-12:TCP详解及实现

本文目录 一、TCP通信流程二、套接字函数2.1 socket()2.2 bind()2.3 listen()2.4 accept()2.5 connect() 三、demo实现3.1 server端代码3.2 client端代码 四、TCP三次握手五、TCP滑动窗口六、TCP四次挥手七、多进程并发服务器 一、TCP通信流程 先来讲讲服务器端,是…

【Maven】项目管理工具-Maven

目录 1. Maven简介 1.1 项目管理 1.2 项目构建 1.3 项目构建工具 1.4 Maven的四大特征 1.4.1 依赖管理系统 1.4.2 多模块构建 1.4.3 一致的项目结构 1.4.4 一致的构建模型和插件机制 1.5 Maven模型 ​编辑 2.maven的安装配置 2.1 Maven的安装配置 2.1.1检测jdk的版…

dijkstra算法类型题解

dijkstra算法(有权图,无权图): 带权路径长度——当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度 初始化三个数组,final标记各顶点是否已找到最短路径,dist最…

RabbitMQ 消息顺序性保证

方式一:Consumer设置exclusive 注意条件 作用于basic.consume不支持quorum queue 当同时有A、B两个消费者调用basic.consume方法消费,并将exclusive设置为true时,第二个消费者会抛出异常: com.rabbitmq.client.AlreadyClosedEx…

基于开源AI智能名片2+1链动模式S2B2C商城小程序的个人IP活动运营策略与影响力提升研究

摘要:本文围绕个人IP运营者借助活动运营提升影响力这一主题,深入探讨如何将开源AI智能名片21链动模式S2B2C商城小程序融入借势、造势、提升参与感及用户激励等活动运营环节。通过分析该创新模式与活动运营各要素的结合点,为个人IP运营者提供切…

计算机图形学论文 | 面向制造的设计: 五轴铣削的几何制造可行性评估

🍕🍕🍕宝子们好久不见,新年快乐~~~,今天我们来更新一篇关于五轴CNC制造中的模型制造可达性分析的论文。老规矩: 红色是名词,蓝色是结论,绿色是文章工作,黄色是一些其他重…

deepseek搭建本地知识库

ollama是一个大模型的运行框架,在上面可以运行不同的大模型 部署deepseek 下载ollama:https://ollama.com/ 下载模型:https://ollama.com/library/deepseek-r1:1.5b ollama run deepseek-r1:1.5b运行起来之后,本地命令行就可以…

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要 一、Django 5Django 5 的主要特性包括: 二、MVT模式三、官方网站四、内置功能数据库 ORM(对象关系映射)用户认证和授权表单处理模板引擎URL 路由缓存框架国际化和本地化安全性功能管…

deepseek本地部署-linux

1、官网推荐安装方法(使用脚本,我绕不过github,未采用) 登录ollama下载网站https://ollama.com/download/linux,linux下有下载脚本。 正常来说,在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ollama-linux-arm64.tgz wget https://ollama.com/download/ollam…

多光谱技术在华为手机上的应用发展历史

2018 年,华为 P20 系列首次搭载 5 通道色温传感器,可帮助手机在不同光照条件下保持画面色彩一致性。 2020 年,华为 P40 系列搭载 8 通道多光谱色温传感器(实际为 11 通道,当时只用 8 个通道检测可见光)&am…

增加工作台菜单页面,AI问答应用支持上下文设置,数据库表索引优化,zyplayer-doc 2.4.8 发布啦!

zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,支持在线编辑富文本、Markdown、表格、Office文档、API接口、思维导图、Drawio以及任意的文本文件,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,支持以内…

4.python+flask+SQLAlchemy+达梦数据库

前提 1.liunx Centos7上通过docker部署了达梦数据库。从达梦官网下载的docker镜像。(可以参考前面的博文) 2.windows上通过下载x86,win64位的达梦数据库,只安装客户端,不安装服务端。从达梦官网下载达梦数据库windows版。(可以参考前面的博文) 这样就可以用windows的达…

基础入门-网站协议身份鉴权OAuth2安全Token令牌JWT值Authirization标头

知识点: 1、网站协议-http/https安全差异(抓包) 2、身份鉴权-HTTP头&OAuth2&JWT&Token 一、演示案例-网站协议-http&https-安全测试差异性 1、加密方式 HTTP:使用明文传输,数据在传输过程中可以被…

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华,以语表达心中所想 大家好,我是whisperrrr. 前言: 大家好,我是你们的朋友whisrrr。在日常工作中,MySQL作为一款广泛使用的开源关系型数据库,其强大的功能为我们提供了便捷的数据存储和管理手段。而在…

C++ 使用CURL开源库实现Http/Https的get/post请求进行字串和文件传输

CURL开源库介绍 CURL 是一个功能强大的开源库,用于在各种平台上进行网络数据传输。它支持众多的网络协议,像 HTTP、HTTPS、FTP、SMTP 等,能让开发者方便地在程序里实现与远程服务器的通信。 CURL 可以在 Windows、Linux、macOS 等多种操作系…

win编译openssl

一、perl执行脚本 1、安装perl脚本 perl安装 2、配置perl脚本 perl Configure VC-WIN32 no-asm no-shared --prefixE:\openssl-x.x.x\install二、编译openssl 1、使用vs工具编译nmake 如果使用命令行nmake编译会提示“无法打开包括文件: “limits.h”“ 等错误信息 所以…

idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…