.NET环境下实现程序集的动态替换.docx

.NET环境下实现程序集的动态替换.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.NET环境下实现程序集的动态替换

.NET环境下实现程序集的动态替换.NET程序集是包含一个或者多个类型定义文件和资源文件的集合,它是 .NET Framework 编程的基本组成部分。也可以通俗地描述它为由.NET生成的.exe文件或者.dll文件。.NET环境下支持两种程序集:弱命名程序集和强命名程序集。 弱命名程序集和强命名程序集在结构上是相同的。他们都采用PE文件格式,包含PE表头,CLR表头,元数据和清单表。区别在于:强命名程序集拥有一个发布者的公钥/私钥签名对,他们用于唯一的标识程序集的发布者。通过公钥/私钥对,我们可以对程序集进行唯一的标识,安全策略和版本策略。一、需求背景在传统的win32环境下,我们只需要将程序集覆盖同名程序集,便可以实现对程序集的动态替换。但是这种替换方式,很容易导致DLL Hell问题。DLL Hell问题是指两个不同的公司可能开发处具有相同名称的程序集,如果将相同名称的程序集放置到同一个目录下,则会出现程序集覆盖现象,最后安装的程序集会覆盖前面的程序集,从而可能导致应用程序不能正常运行。为了解决这一问题,在.NET环境下,CLR采取了强命名程序集的方式来唯一的表示程序集。强命名程序集包含四个标识:名称,版本号,语言文化标识和一个共有/私有密钥对。显然地,在.NET环境下,仅程序集名称相同的两个程序集,是不会发生动态替换的情况的。那么,在.NET环境下,我们如何才能实现强命名程序集的动态替换呢?下面我们假想这样一个应用场景:我们熟悉的System.Data.SqlClient.dll就是一个.NET程序集,该程序集是微软官方提供的数据提供程序(.NET Data Provider),它是.NET应用程序与数据库交互的桥梁。图一展示了常见.NET应用系统的结构。一般地,.NET应用系统包括应用程序,.NET Data Provider 以及数据库。应用程序需要通过.NET Data Provider才能向数据库中访问和存储数据。图一:.NET应用系统结构图正常情况下,上面介绍的应用系统可以很好地服务于企业日常运作,满足企业需求。但是在某些特殊情况下,出于对成本和业务扩展等因素的综合考虑,企业需要更换应用系统的后台数据库,比如,将后台数据库由SQL Server更换为神通数据库。自然地,我们想到要将数据提供程序由System.Data.SqlClient.dll更换为System.Data.OscarClient.dll,然后,重新收集企业的业务需求,最终重新编写应用程序。但是,如果为了节省成本,企业强烈要求不能更换应用程序,仍然使用现有的应用程序,作为一个程序员,你是否会觉得该需求不可能实现?让我们重新梳理一下需求:后台数据库由SQL Server更换为神通数据库,应用程序保持不变,即:不能修改应用程序源代码,并且不能对应用程序进行重新编译,我们看到应用程序只是一些程序集文件(.exe文件或.dll文件)。如果想完成该项目,看来只能从.NET Data Provider入手了,但是,看起来这也是不可能完成的任务,因为System.Data.SqlClient.dll是经过强命名的程序集,它的公钥标记是b77a5c561934e089,这个程序集已被调用它的应用程序所记住,在应用程序不作任何变动的情况下,即使我们基于System.Data.OscarClient.dll仿冒出一个System.Data.SqlClient.dll,但是因为公钥标记不匹配,上层应用程序仍不识别该程序集,应用系统也将无法正常运行。如果能修改上层应用程序所记住System.Data.SqlClient.dll的公钥标记,用一个新的公钥标记来代替,并将该标记设置为仿冒出来的System.Data.SqlClient.dll的公钥标记,问题便可迎刃而解。要修改强命名程序的公钥标记,调用 Mono.Cecil组件是唯一的选择。二、Mono.Cecil简介Mono.Cecil是Mono的组件之一,它是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还可以修改已有的程序集。我们可以用它来打探一个.NET程序集内部的结构,就像反射那样,只不过并不需要将程序集加载进来,Mono.Cecil只是读取文件物理内容而已。更重要的是,Mono.Cecil可以修改并保存程序集,这便可以让我们实现各种各样的要求。另外,它支持多个运行时框架如:.NET2.0、.NET3.5、.NET4.0以及silverlight程序。显然地,有了Mono.Cecil,我们可以容易地实现程序集的动态替换,Mono.Cecil的功能非常强大,本文只涉及了很少的一部分。三、解决方案及步骤将Mono.Cecil应用于本项目的主要思路是用Mono.Ce

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档