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

         文件版本是一个很难解决的问题。实际上,如果仅仅在一个文件中将其某一位从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

(译注:上述查看

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

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

相关文章

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache原理及最佳实践 1. Guava Cache是什么1.1 简介1.2 核心功能1.3 适用场景 2. Guava Cache的使用2.1 创建LoadingCache缓存2.2 创建CallableCache缓存 缓存的种类有很多,需要根据不同的应用场景来选择不同的cache,比如分布式缓存如redis、memca…

图床搭建GitHub+PicGo+jsdelivr(CDN)+Typora(内附加速工具)

目录 安装PicGo GitHub配置与加速器 配置PicGo 使用typroa 安装PicGo PicGo是一个用于上传图片的客户端,支持拖拽上传、剪贴板上传,功能十分方便。 下载地址: https://github.com/Molunerfinn/PicGo/releases 个人网盘自取版本2.4.0…

2024五一杯数学建模竞赛A题完整成品论文和代码分析:建立钢板切割的工艺路径动态规划、贪心与分层优化模型

2024五一杯数学建模竞赛A题:建立钢板切割的工艺路径动态规划、贪心与分层优化模型 2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 本文文章较长,建议先目录。经过不懈的…

IoTDB 入门教程③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序:https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载:https://archive.…

企业文化如何写??

编写企业文化时,要确保内容既能够体现公司的核心价值观、愿景和使命,又能够激发员工的归属感和工作热情。以下是一些关于如何编写企业文化的建议: 一、明确企业文化的重要性 企业文化是一个组织的灵魂,它影响着员工的工作态度、…

8、ftp使用教程

ftp使用教程 1、FTP概述:2、ftp主动模式和被动模式3、配置说明4、多用户配置5、异常6、ftp命令附录 1、FTP概述: ​ FTP是文件传输协议(File Transfer Protocal)的简写,主要完成与远程计算机的文件传输。 FTP采用客户…

【树——数据结构】

文章目录 1.基本概念2.基本术语1.结点之间的关系描述2.结点,树的属性描述3.有序树,无序树4.森林 3.树的性质考点1考点2考点3考点4 4.树的存储结构5.树和森林的遍历 1.基本概念 结点,根节点,分支结点,叶子结点&#xf…

【Mac】Axure RP 9(交互原型设计软件)安装教程

软件介绍 Axure RP 9是一款强大的原型设计工具,广泛用于用户界面和交互设计。它提供了丰富的功能和工具,能够帮助设计师创建高保真的交互原型,用于展示和测试软件应用或网站的功能和流程。以下是Axure RP 9的主要特点和功能: 交…

(1)探索 SpringAI - 基本概述

人工智能简介 A system is ability to correctly interpret external data, to learn from such data, and to use those learnings to achieve specific goals and tasks through flexible adaptation. 翻译:系统正确解释外部数据的能力,从这些数据中学…

Unity MeshRenderer 入门

概述 在项目制作过程中,肯定缺少不了模型的使用,那就一定接触过MeshRenderer,也许还有你不理解的地方,接下来让我们来学习一下这部分的内容吧。 Mesh Filter(网格过滤器) Mesh:提供一个网格的参考&#xf…

H.265 与 H.264 的主要区别

H.265 与 H.264 的主要区别 H.265 与 H.264 的主要区别各模块技术差异汇总宏块划分帧内预测模式帧间预测模式去块滤波ALF自适应环路滤波采样点自适应偏移(Sample Adaptive Offset)滤波并行化设计TileEntropy sliceDependent SliceWPP(Wavefro…

WORD排版常见问题与解决方案

前言 近期使用word软件进行论文排版工作,遇到了一些常见的问题,记录一下,避免遗忘。 基本配置 系统环境:win10/win11 word版本:Microsoft Office LTSC 专业增强版 2021 问题与解决方案 问题1:页眉显示内…

Java IO流(一)

1. IO流概述 1.1 什么是IO流 在计算机中,input/output(I/O、i/o 或非正式的 io 或 IO)是信息处理系统(例如计算机)与外界(可能是人类或其他信息处理系统)之间的通信。 输入是系统接收到的信号或…

c#Excel:2.写入Excel表 3.读取Excel表

--写入Excel表-- 该例首先从数据库aq中读取学生信息表staq(参考数据库章节),然后将学生信息表中的数据写入Excel表格中 (1)在OfficeOperator项目的ExcelOperator类中定义索引器,用于获取Excel表格中的单元格,代码如下…

理解Linux文件系统

文章目录 一、引言二、Linux文件系统概述1、文件系统的结构2、文件系统目录树的逻辑结构 二、文件系统的特性1、super block:文件系统的超级块2、inode:文件系统的索引节点3、inode table4、block:文件系统的数据块5、块组描述符表&#xff0…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件? 如上所示,就是控件,而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧,会有对应的空间…

第 8 章 机器人平台设计(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 学习到当前阶段大家对ROS已经有一定的认知了,但是之前的内容更偏理论,尤其是介绍完第6…

ccpc热身赛题目1:中文系Roliy的困惑

代码 import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<String> list new ArrayList<>();char [] charArr new char[32];for (int i 0; i < charArr.length; i) {charArr[i] 0…

python 怎么调用R

如何在python中调用R&#xff1f;这其中包括了如何调用R的对象&#xff08;函数和包&#xff09;&#xff0c;R和python的对象如何互相转换&#xff0c;以及如何调用R的脚本&#xff08;外界参数的输入&#xff09;。python提供了一个模块rpy2&#xff0c;可以较好地完成这项工…

RCE学习(一)

一.知识点 RCE&#xff1a;远程命令/代码执行漏洞&#xff0c;简称为RCE漏洞&#xff0c;可以直接向服务器后台远程注入操作系统的命令或者代码&#xff0c;从而拿到服务器后台的权限。RCE分为远程执行命令&#xff08;执行ping命令&#xff09;和远程代码执行eval 简单来说就…