Microsoft.NET 框架程序设计 —— 共享程序集

news2024/11/16 9:39:06

         文件版本是一个很难解决的问题。实际上,如果仅仅在一个文件中将其某一位从0改变到1、或者从1改变到0,我们便不能绝对保证使用原来文件的代码和它使用新版文件时的行为一样。这是因为许多应用程序都会有意或者无意地引入bug。如果一个文件的后续版本修复了一个bug,应用程序便不再如预期那样运行。

        这就存在一个问题:怎样在修复bug和增加特性的同时,还能保证不会损坏现有的应用程序?我曾经对这个问题思考了很久,并且得出了一个结论--那就是这是不可能的。很明显,这样的回答解决不了问题。应用程序文件总是会携带bug,开发人员也总是想增加新的特性。在对应用程序的正常运行抱有良好预期的同时,还必须采用另一种分发新文件的方式来保证一旦应用程序不能正常运行,我们仍然可以将它们轻易地恢复到最近一次的正常状态。  

3.1 两种程序集、两种部署方式

         .NET 框架支持两种程序集:弱命名程序集(weaklynamed assembly)和强命名程序集(stronglynamed assembly)。

重要 顺便说一句,在.NET框架的任何文档中都找不到“弱命名程序集”这个术语。为什么呢?因为这是我个人命名的。这里决定发明这个术语的目的是能使我们在谈论程序集时,不至于造成某种混淆。

        弱命名程序集和强命名程序集在结构上是相同的,也就是说,它们使用同样的PE文件格式、PE表头、CLR表头、元数据,以及清单表。并且我们可以使用同样的工具(例如C#编译器和AL.exe)来生成两种程序集。二者之间的真正区别在于,强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对惟--地标识了程序集的发布者。利用公钥/私钥对,我们可以对程序集进行惟一的标识、实施安全策略和版本策略,从而可以将其部署在用户硬盘的任何地方、甚至互联网上。这种惟一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略。

 3.2 强命名程序集

        如果-个程序集要被多个应用程序访问,那么这个程序集必须被放在一个CLR确知的目录下。
当CLR检测到该程序集被引用时,它会自动到这个目录下查找该程序集。

        然而,这里有一个问题:两个(或多个)不同的公司可能会生产出有相同名称的程序集来。如果这些同名程序集都被复制到相同的目录下,最后一个安装的程序集将会替代前面的程序集,引用那些程序集的所有应用程序将不能再如期运行。(这实际上就是目前 Windows中出现 DLLhell 的原因。)

        很明显,简单地用文件名来区分程序集是不够的。CLR需要支持某种机制来惟一地标识一个程序集。这就是所谓的强命名程序集。一个强命名程序集包含四个惟一标识程序集的特性:文件名(没有扩展名)、版本号、语言文化标识、和一个公有密钥标记(由公有密钥产生的一个值)。下面的字符串分别标识了四个不同的程序集文件:

"MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken-b77a5c561934e089"
"MyTypes,Version=1.0.8123.0,Culture-"en-Us",PublicKeyToken-b77a5c561934e089"
"MyTypes,Version=2.0.1234.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
"MyTypes,Version=1.0.8123.0,Culture=neutral,PublicKeyToken-b03f5f7f11d50a3a"


        其中第一个字符串标识了一个名为 MyTypes.dll 的程序集。它的版本号为 1.0.8123.0,并且没有设定任何特殊的语言文化,因为Culture被设为 neutral。当然,任何公司都可能生产一个名为 MyTypes.dll版本号为 1.0.8123.0,以及语言文化中性的程序集。

        所以,必须有一种方式能够将一个公司的程序集和另一个公司的程序集区别开来。由于某些原因微软选择了标准的公钥/私钥对加密技术(其他标识惟一性的技术有 GUID、URL、URN等)。这种加密技术使得我们在程序集被安装到用户硬盘上的时候,能够校验其内比特位的完整性,并且还可以根据发布者的身份来授权某些许可。

        这样,如果一个公司想惟一地标识它的程序集,那么它必须首先获取一个公钥/私钥对。然后将公有密钥和程序集相关联。不存在两个公司拥有同样的公钥/私钥对的情况,这种区分使得我们能够创建有着相同名称、版本、语言文化的程序集,而不引起任何冲突。

注意 利用 System.Reflection.AssemblyName 类,我们可以很容易地创建一个程序集名称,并获取一个程序集名称的各个部分。该类提供了几个公有实例属性,例如CultureInfo、FullNameKeyPair、Name,以及 Version。该类还提供了几个公有实例方法,例如 GetPublicKeyGetPublicKeyToken、SetPublicKey,以及SetPublicKeyToken。

        一个弱命名程序集可以在其清单元数据中嵌入版本号和语言文化特性,但CLR总会忽略版本号,并且只有在搜寻子目录查找卫星程序集的时候才会使用其中的语言文化信息。因为弱命名程序集总是以私有方式部署的,所以CLR在程序集的基目录或任何子目录(在XML配置文件定位元素的privatePath属性中指定)中搜索程序集时,它只需利用该程序集的名称(加上扩展名.d1或者exe)就可以了。

        一个强命名程序集包含有一个文件名、一个版本号以及一个语言文化信息。另外,强命名程序集还有一个发布者的私有密钥签名。

        创建一个强命名程序集首先需要获取一个用强命名实用工具(Strong Name Utility,即SN.exe和.NET 框架 SDK,以及 Visual Srudio .NET 一起发布的一个工具)产生的密钥。该实用工具提供了整套的功能,我们可以根据命令行开关来指定它们。注意SN.exe的所有命令行开关都是区分大小写的。要产生一个公钥/私钥对,我们可以象下面这样运行SN.exe实用工具:

        SN -k MyCompany.keys

        该命令告诉 SN,exe 创建一个名为 MyCompany.keys的文件。MyCompany.keys 文件将包含一对以二进制格式存储的公有密钥和私有密钥。

        公有密钥非常大。我们可以执行下面的命令来查看它们:

        SN tp MyCompany.keys

(译注:上述查看

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PotatoPie 4.0 实验教程(34) —— FPGA实现摄像头图像二值化腐蚀效果

链接直达 https://item.taobao.com/item.htm?ftt&id776516984361 图像二值化腐蚀处理有什么作用? 图像二值化腐蚀处理在图像处理中起到了以下作用: 物体分割与提取:在图像二值化之后,通过腐蚀操作可以消除噪声、连接相邻的…

搭建Kafka源码环境并测试

文章目录 一、前言二、环境准备三、环境搭建3.1 JDK 环境搭建3.2 Scala 环境搭建3.2.1 配置 Scala 环境变量3.2.2 验证 3.3 Gradle 环境搭建3.3.1 配置 Gradle 环境变量3.3.2 验证 3.4 Zookeeper 环境搭建3.4.1 配置 Zookeeper 环境变量3.4.2 验证 3.5 Kafka 源码搭建3.5.1 导入…

44. UE5 RPG 初始化敌人的属性

在正常的游戏中,我们应该考虑如何去初始化角色属性,并且要给角色分好类型。比如,在我们游戏中,我们如何去初始化小兵的属性,并且还要实现小兵随着等级的增长而增加属性。而且就是小兵也有类型的区分,比如我…

使用qemu调试NVME driver

参考nvme驱动相关的博客,可以使用qemu buildroot进行nvme驱动的流程debug。 一、QEMU编译 首先需要编译qemu,可以参考QEMU编译。wget下载最新版本的QEMU,编译之前,最好检查下依赖包是否安装,避免安装过程出现各种错…

c++容器与算法概述

容器与算法 每个标准库容器都提供了begin() end() 函数&#xff0c;分别返回容器的头部位置和尾部位置。 I/O 流 对于自定义的类型&#xff1a; struct Entry {std::string name;int number;};如果需要使用标准输出需要重载<< 运算符&#xff0c;特别注意&#xff1a…

环形链表的经典问题

环形链表 环形链表的介绍链表中是否带环返回链表开始入环的第一个节点 本文主要介绍如何判断一个链表是否是环形链表&#xff0c;以及如何得到环形链表中的第一个节点。 环形链表的介绍 环形链表是一种链表数据结构&#xff0c;环形链表是某个节点的next指针指向前面的节点或指…

微软如何打造数字零售力航母系列科普05 - Azure中计算机视觉的视觉指南

Azure中计算机视觉的视觉指南 什么是计算机视觉&#xff1f;如何使用Microsoft Azure将计算机视觉功能集成到应用程序和工作流中&#xff1f; 作者&#xff1a;Nitya Narasimhan 编辑&#xff1a;数字化营销工兵 •11分钟阅读 什么是计算机视觉&#xff1f;如何使用Microso…

在树莓派安装 rpi-imager

步骤 安装 sudo apt install rpi-imager 我没有更新镜像源&#xff0c; 但是能安装完&#xff0c; 只是花的时间旧点。 烧写镜像 因为我是没有桌面的树莓派系统&#xff0c; 所以我这里执行的指令是不需要显示图形化界面的 man rpi-imager ## man指令查看说明 查看帮助手…

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 &#xff08;1&#xff09;登录接口 &#xff08;2&#xff09;图书列表接口 三、服务器代码 &#xff08;1&#xff09;创建一个UserController类&#xff0c;实现登录验证接口 &#xff…

服务运营 | 精选:用药难?用药贵?运筹学与统计学视角下的药物研发与管理

作者设计了一个多阶段博弈论模型来针对罕见病的不同补贴方案&#xff0c;分析政府、联盟、制药商和患者之间的相互作用。 制药商补贴为 α C \alpha C αC&#xff0c;其中 C C C是研发成本&#xff0c; α ∈ [ 0 , 1 ) \alpha \in [0,1) α∈[0,1)是政府总成本的比例。患者补…

vue3 依赖-组件tablepage-vue3 项目公共配置封装

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

模型智能体开发之metagpt-多智能体实践

参考&#xff1a; metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case&#xff0c;但是现实生活场景是很复杂的&#xff0c;所以单智能体远远不能满足我们的诉求&#xff0c;所以仍然还需要了解多智能体的实现。通过多个role对动…

Android11适配

一、分区存储 1.背景 Android 11 进一步增强了平台功能&#xff0c;为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分&#xff0c;平台引入了进一步的改进&#xff0c;以简化向分区存储的转换。 为了让用户更好地控制自己的文件&#xff0c;保护用户…

【华为】华为防火墙双机热备

【华为】华为防火墙双机热备 实验需求实验拓扑配置FW5-M前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; FW6-B前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; LSW2PC NATSNAT &#xff1a;Easy IPDNAT&…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分&#xff0c;它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中&#xff0c;聚碳酸酯&#xff08;PC&#xff09;是一种常用的材料&#xff0c;它具有高抗冲击性、耐化学品腐蚀和优良的…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

使用 Python 和 OpenCV 进行实时目标检测的详解

使用到的模型文件我已经上传了&#xff0c;但是不知道能否通过审核&#xff0c;无法通过审核的话&#xff0c;就只能 靠大家自己发挥实力了&#xff0c;^_^ 目录 简介 代码介绍 代码拆解讲解 1.首先&#xff0c;让我们导入需要用到的库&#xff1a; 2.然后&#xff0c;设…

【数据结构-之八大排序(下),冒泡排序,快速排序,挖坑法,归并排序】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展&#xff1a;意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用&#xff08;1&#xff09;意向锁的兼容互斥性&#xff08;2&#xff09;例子1&#xff08…

Springboot+vue+小程序+基于微信小程序的在线学习平台

一、项目介绍    基于Spring BootVue小程序的在线学习平台从实际情况出发&#xff0c;结合当前年轻人的学习环境喜好来开发。基于Spring BootVue小程序的在线学习平台在语言上使用Java语言进行开发&#xff0c;在数据库存储方面使用的MySQL数据库&#xff0c;开发工具是IDEA。…