记一次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章 共享程序集和强命名程序集
随机推荐
- 大数据学习--day02(标识符、变量、数据类型、类型转换、进制转换、原码反码补码)
标识符.变量.数据类型.类型转换.进制转换.原码反码补码 标识符: java50个关键字不能做标识符,以数字开头不能做标识符(这个老是忘记写一个类名的时候) 变量: 变量分为成员变量和局部变量,注意作 ...
- Scala基本语法总结(一)
Scala基本语法总结 时隔快一年了,又捡起scala,不是想学的有多么的精通,只是想把之前遇到的知识点和实践中遇到的重点进行归纳总结,对以后的面试或许有点帮助吧! 一.scala开发环境的配置 我这 ...
- 自添加LUCI菜单及编译为ipk
目录 添加汉化编译为ipk配置文件入口函数界面文件Makefile 添加 添加自己的luci界面,有3个必要的要素: a配置文件.新建一个在/etc/config/abcdefg b入口函数.新建一个 ...
- python学习——初始面向对象
一.讲在前面 编程的世界中有三大体系,面向过程.面向函数和面向对象编程.而面向过程的编程就包括了面向函数编程,接下来说一下面向对象.假如 ,你现在是一家游戏公司的开发人员,现在需要你开发一款叫做< ...
- QOS-交换机拥塞管理
QOS-交换机拥塞管理 2018年7月7日 20:29 优先级映射: 根据信任的优先级,查找映射表,标记丢弃优先级和本地优先级 如果信任端口优先级,不同产品优先级标记方式可能不同,S3610处理过程如 ...
- C# 获取UTC 转换时间戳为C#时间
获取UTC /// <summary> /// 获取时间戳 /// </summary> /// <returns>UTC</returns> publ ...
- MongoDB入门---数据库&&&集合的基本操作
MongoDB作为一种nosql的数据库,它自己本身的增伤改查还有数据库集合的创建和展示与一般的数据库较之是有一部分差别的.我们今天就来看一下MongoDB的一些基本操作. 首先呢,就是先来数据 ...
- CakePHP中回调函数的使用
我们知道模型主要是用来处理数据的,有时我们想在模型操作之前或之后做一些额外逻辑处理,这时候就可以使用回调函数. 回调函数有很多种,beforeFind,afterFind,beforeValidate ...
- 一步一步学习JNI
本文来自网易云社区 作者:孙有军 前言 本篇的主要目的就是JNI开发入门,使大家对JNI开发流程有一个大致的了解,后续再进行深入学习. JNI不是Android特有的,JNI是Java Native ...
- vuecli结合eslint静态检查
vuecli结合eslint静态检查 搭建vue项目开发可能选择vue-cli项目脚手架快速创建vue项目.(https://github.com/vuejs/vue-cli) 安装vue-cli n ...