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

(译注:上述查看

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

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

相关文章

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 (一)定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的:使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习六

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

用FPGA+DAC输出“心”形波

1.前言 之前在做信号处理的时候整了一下活,用FPGADAC(数模转换器),输出了一个爱心形状的波形,今天整理资料的时候偶然发现了他,现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示: …

雅思备考经验(个人向)

IELTS备考经验(个人向) 备考时长约1个月, 首考6.5(6), 虽然没考到小分6.5, 我也接受了, 过段时间再考吧. 机考or纸笔 雅思有机考也有传统的纸笔考试形式, 个人更推荐机考, 原因如下: 机考口语和笔试一般都在同一天, 而纸笔的口语和笔试一般不在同一天, 有时候可能会差一个…

工业三废数据集(工业烟粉尘排放量、工业二氧化硫排放量、工业废水排放量)2006-2021年

01、数据介绍 工业三废是指工业生产过程中排出的废气、废水和废渣 工业二氧化硫排放量指企业在燃料燃烧和生产工艺过程中排入大气的二氧化硫数量。 工业烟粉尘排放量是指企业在生产工艺过程中排放的烟尘和粉尘等颗粒物重量。 工业废水排放量是指企业在生产过程中产生的废水…

GEE必须会教程—植被覆盖度(FVC)计算(代码分享)

植被覆盖度(FVC)的计算是遥感上非常重要的一个研究领域,因事务繁忙,今天小编先带来FVC的全文代码,给大家试试,后期会出一期专栏进行代码的详细介绍: 今天福利满满,直接上代码&#…

信息技术内涵及意义

一、信息技术及其演进趋势 (一)信息技术概况概念 信息技术(Information Technology,IT)指“应用在信息加工和处理中的科学、技术与工程的训练方法与管理技巧;上述方法和技巧的应用;计算机及其…

【氮化镓】GaN器件在航天器高可靠正向转换器中应用

文章是发表在《IEEE Journal of Emerging and Selected Topics in Power Electronics》2022年10月第10卷第5期上的一篇关于GaN(氮化镓)器件在航天器高可靠性正向转换器中应用的研究。文章的作者是匹兹堡大学电气与计算机工程系的Aidan Phillips, Thomas Cook和Brandon M. Gra…

【C语言视角】数据结构之~二叉树

前言:总所周知~数据结构的二叉树对于初学者来说是一个十分难理解的知识点。接下来,请阅读本人对二叉树拙劣的理解~ 目录 1.二叉树概念及结构 和性质 二叉树的结构 二叉树的存储结构 2.二叉树顺序结构 3.二叉树链式结构的实现 二叉树层序遍历 1.二叉树…

Flask路由的使用

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探…

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

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

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

系统调用 int 86 的过程

该图借鉴与 Linux系统调用全过程详解-高性能服务器开发,向作者致敬。

Vue 之 在当前页面的实现分页效果

目录 场景实现 场景 假设,我们现在有这么一个需求: 上述图片的空白内容是活动的,由下面的两个按钮控制上一页、下一页;我们应该可以怎么去实现? 实现 思路: 其实这个问题,我们仿照其他的UI框…

关于远程桌面与3389端口的深度解析

当我们谈论远程桌面和3389端口时,我们实际上是在探讨Windows操作系统的一个核心功能,该功能允许用户通过网络从任何地点远程控制和管理计算机。而3389端口,正是这一功能所依赖的通信端口。 一、远程桌面的工作原理 远程桌面协议(R…

AppWeb 身份验证绕过漏洞 (CVE-2018-8715)

一、docker的相关操作(默认安装了docker-compose) 在相应的文件夹位置打开终端后进行如下操作 运行此靶场 sudo docker-compose up -d 查看启动环境 sudo docker ps 关闭此靶场环境 sudo docker-compose down 二、漏洞描述 AppWeb 是一个嵌入式 Web 服…

数组克隆/复制

数组的复制/克隆 1.浅克隆2.深克隆3.使用System.ArrayCopy()方法4.使用Arrays.copyOf()方法5.使用Arrays.copyOfRange()方法6.使用Object.clone()方法 1.浅克隆 将原来数组的地址赋值给新数组,两个数组名指向了同一个数组,修改其中一个中的元素&#xff…

jvm面试题30问

什么是JVM的跨平台? 什么是JVM的语言无关性? 什么是JVM的解释执行 什么是JIT? JIT:在Java编程语言和环境中,即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(…

【精选文献】JAG|基于时序Sentinel-1 SAR影像小农耕作区烟草空间分布制图

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 03 研究区域与数据集 04 研究方法 05 研究结果 06 研究讨论 07 研究结论 08 文章引用 文章简介 论文名称:Mapping tobacco planting areas in smallholder farmlands using Phenological-Spatial-Te…

【自用】在ipad上安装.ipa文件

借助爱思助手在ipad上安装.ipa文件 爱思助手官网(www.i4.cn) 对于不能上架 App Store 的应用,可以使用证书签名或使用 Apple ID 签名后正常安装到设备。准备好证书或 Apple ID以及需要签名的 IPA 文件,使用爱思助手就可以快速完成…