记一次dll强命名冲突事件
一 问题的出现
现在要做一个net分布式平台,平台涉及多个服务之间调用问题,最基础的莫过于sso。由于我们的sso采用了wcf一套私有框架实现,另外一个webapi服务通过接口调用sso服务。由于sso和webapi都同时采用了
在net平台下广泛使用的序列化库Newtonsoft.Json,虽说他是开源的。,但是被不同的dll依赖过后会带有强命名。这个时候sso使用了Newtonsoft.Json强命名a,而webapi的system.web.http使用了Newtonsoft.Json强命名b
这个时候webapi又使用了我们的私有框架,又使用了webapi相关dll,他们都共同依赖Newtonsoft.Json这个序列化库,但是呢他们依赖的强命名却不同,这个时候就产生了dll冲突。
二 背景知识
强命名的概念:我们都知道一个dll有文件名,版本号,语言,公钥等关键元数据信息组成,在net中强命名就是这几个元数据组合而形成的一个标识,这个标识就是强命名,他的意图就是要唯一性的标识一个dll文件。
至于为什么要强命名一个dll,可以百度下dll hell也就是dll地狱相关资料。这个强命名中最能够唯一化的就是公钥也就是publikeytoken,他是通过我们的snk,加密生成的一个公钥私钥对,私钥存储在程序集清单中,用于加密,而公钥用于解密和发布dll。由于公有私有采用rsa非对称加密算法,所以理论上这个公有和私有是唯一的。
强命名与弱命名引用关系:微软规定强命名的dll所依赖的dll也必须是强命名的,反之不是这样,弱命名所依赖的dll可以是强命名也可以是弱命名。如GAC中的dll均是强命名,而我们一般开发的应用程序没有强命名也正常运行。
三 dll依赖关系梳理

从这个图中梳理出产生了dll冲突的原因所在,那么自然就有了解决办法。
四 解决思路
第一种办法:由于微软提供的dll使用了强命名Newtonsoft.Json,这里是私有基础库只有来适应微软,我们统一使用Newtonsoft.Json编译整个基础库,万幸问题得以解决。
第二种办法:如果我们的三方库再有像webapi一样又依赖了强命名的Newtonsoft.Json C且没有源码这个时候就难办了啊,但是这种情况该是不多吧~~,如果真出现了估计得改变技术方向了,这里的服务之间采用的是net程序集接口直接调用方式,如果真有第三种情况出现,那么这种接口方式估计得换成webapi方式,直接将服务的接口进行物理层隔离。所有服务之间交互通过webapi接口实现,在物理上隔离,统一协议进行协作了。
第三种办法:学习GAC思路,GAC的一个dll也会对应多个版本,所以可以考虑将dll注册到GAC,所不同的是需要有一个GAC注册过程
记一次dll强命名冲突事件的更多相关文章
- membership DB生成 & dll 强命名 & 证书生成
UPD(Membership)数据库安装1.使用 Aspnet_regsql.exe 安装数据库 在 C:\WINDOWS\Microsoft.NET\Framework\\aspnet_regsql ...
- .net程序集强命名(签名)
要想得到强签名的dll有两种情况: 1.给项目添加强命名 在你的项目右键->属性->签名,勾选“为程序集签名”,新建 或 浏览已经新建过的.pfx文件,然后重新build项目,生成的dll ...
- C# 强命名程序集,防止dll被修改,混淆下发布
未能加载文件或程序集“Jonckers.Service.RedisCacheEngineExtend, Version=1.0.0.0, Culture=neutral, PublicKeyToken ...
- .NET中查看一个强命名程序集(*****.dll)的PublicKeyToken的方法
使用命令行工具SDK Command Prompt,键入:SN -T C:\*****.dll (dll文件所在的路径) 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有 ...
- 只有ReflectionOnlyLoadFrom才可以拯救与GAC冲突的强命名程序集
先说结论,如果有两个拥有相同程序集名称的强命名程序集,一个在GAC里,一个不在.怎样动态加载那个不在GAC里的程序集?答案就是只有Assembly.ReflectionOnlyLoadFrom才可以加 ...
- .NET程序集强命名删除与再签名技术 源代码剖析
如果你想去除一个程序集的强签名(strong name),目前为止可以有两个途径 1 反编译为IL代码,删除签名部分,再编译为程序集 2 应用Re-Sign程序,直接对一个程序集再签名 生成和读取 ...
- CLR 关于强命名程序集 .
如何创建强命名程序集(Strong Name Assembly) 创建一个强命名程序集首先需要获得一个用强命名实用工具 (Strong Name Utility,即SN.exe,.NET ...
- 解决ambiguous symbol命名空间中类名、变量名冲突的问题
最近在将一个复杂的工程集成到现有的项目中.编译时发现,有的变量名冲突了,提示就是xxxx ambiguous symbol,并且在编译输出时,指明了两个文件当中特定的变量名或者类名相同.出现这个编译错 ...
- 第一部分 CLR基础:第3章 共享程序集和强命名程序集
第一部分 CLR基础:第3章 共享程序集和强命名程序集
随机推荐
- ubuntu下的python请求库的安装——Selenium,ChromeDriver,GeckoDriver,PhantomJS,aiohttp
Selenium安装: pip3 install selenium ChromeDriver安装: 在这链接下载对应版本:https://chromedriver.storage.googleapis ...
- 第3章 Hadoop 2.x分布式集群搭建
目录 3.1 配置各节点SSH无密钥登录 1.将各节点的秘钥加入到同一个授权文件中 2.拷贝授权文件到各个节点 3.测试无秘钥登录 3.2 搭建Hadoop集群 1.上传Hadoop并解压 2.配置H ...
- 带提示范围的猜数小游戏--python
import random random_number = random.randint(1, 99) print(random_number) start_data = 1 end_data = 9 ...
- 在线升级python3.3版本
1.sudo su 2.wget -P /usr/local http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz #指定下载到目录/ ...
- BINARYSEARCH有り無しのパフォーマンスの違い
BINARY SEARCHを使用したパフォーマンス検証を行ってみた.この例では.BKPFが約1万件.BSEGが約3万件になるよう調整している.また.SQLの実行に係る時間は無視する事にする. サンプル ...
- python脚本 mongodb到postgresql
安装 mongo模块 pip install pymongo 安装postgresql 驱动 pip install python-psycopg2 1 # -*- coding: utf-8 -* ...
- nodejs module/require
1. wrap up a module using module.exports, name the file to a.js var fun1=function(){ var stylus = re ...
- shiro中基于注解实现的权限认证过程
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...
- LeetCode:46. Permutations(Medium)
1. 原题链接 https://leetcode.com/problems/permutations/description/ 2. 题目要求 给定一个整型数组nums,数组中的数字互不相同,返回该数 ...
- PHP中strtotime()的使用
strtotime是一个非常强大的函数. 传入的参数,详见官网的介绍 本月最后一个周日 echo date('Y-m-d',strtotime('last sunday of this month') ...