一  问题的出现

现在要做一个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强命名冲突事件的更多相关文章

  1. membership DB生成 & dll 强命名 & 证书生成

    UPD(Membership)数据库安装1.使用 Aspnet_regsql.exe 安装数据库 在 C:\WINDOWS\Microsoft.NET\Framework\\aspnet_regsql ...

  2. .net程序集强命名(签名)

    要想得到强签名的dll有两种情况: 1.给项目添加强命名 在你的项目右键->属性->签名,勾选“为程序集签名”,新建 或 浏览已经新建过的.pfx文件,然后重新build项目,生成的dll ...

  3. C# 强命名程序集,防止dll被修改,混淆下发布

    未能加载文件或程序集“Jonckers.Service.RedisCacheEngineExtend, Version=1.0.0.0, Culture=neutral, PublicKeyToken ...

  4. .NET中查看一个强命名程序集(*****.dll)的PublicKeyToken的方法

    使用命令行工具SDK Command Prompt,键入:SN -T C:\*****.dll  (dll文件所在的路径) 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有 ...

  5. 只有ReflectionOnlyLoadFrom才可以拯救与GAC冲突的强命名程序集

    先说结论,如果有两个拥有相同程序集名称的强命名程序集,一个在GAC里,一个不在.怎样动态加载那个不在GAC里的程序集?答案就是只有Assembly.ReflectionOnlyLoadFrom才可以加 ...

  6. .NET程序集强命名删除与再签名技术 源代码剖析

    如果你想去除一个程序集的强签名(strong name),目前为止可以有两个途径 1  反编译为IL代码,删除签名部分,再编译为程序集 2  应用Re-Sign程序,直接对一个程序集再签名 生成和读取 ...

  7. CLR 关于强命名程序集 .

    如何创建强命名程序集(Strong Name Assembly)     创建一个强命名程序集首先需要获得一个用强命名实用工具   (Strong Name Utility,即SN.exe,.NET  ...

  8. 解决ambiguous symbol命名空间中类名、变量名冲突的问题

    最近在将一个复杂的工程集成到现有的项目中.编译时发现,有的变量名冲突了,提示就是xxxx ambiguous symbol,并且在编译输出时,指明了两个文件当中特定的变量名或者类名相同.出现这个编译错 ...

  9. 第一部分 CLR基础:第3章 共享程序集和强命名程序集

    第一部分 CLR基础:第3章 共享程序集和强命名程序集

随机推荐

  1. php ecshop 二级域名切换跳转时session不同步,解决session无法共享同步导致无法登陆或者无法退出的问题

    echshop基础上做了单点登录的 一级域名与二级域名 退出时 清空session 都是一级域名的session 因为二级域名的session是设置在二级域名上的 echshop基础上没有做单点登录的 ...

  2. Hadoop MapReduce自定义数据类型

    一 自定义数据类型的实现 1.继承接口Writable,实现其方法write()和readFields(), 以便该数据能被序列化后完成网络传输或文件输入/输出: 2.如果该数据需要作为主键key使用 ...

  3. 谷歌浏览器修改cookie访问网页的小插件——EditsThisCookie

    cookie是服务器用来区分不同的浏览器客户端的,比如学生A和B同一时段用各自的电脑访问学校访问学校的教务系统查看成绩,登录之后,访问同一页面确出来不同的信息,并且不能查看对方的信息,这就是因为服务器 ...

  4. java 写一个单例设计程序,打印出该对象的地址

    class Test{ public static void main(String[] args) { singleton s1=singleton.getinstance(); singleton ...

  5. VIM Commands

    Vim Commands Commands in NORMAL modes Motions small granular: move by direction k h l j mid granular ...

  6. 单节锂电池充电(电路)芯片TP4056

  7. docker (2) 通用/镜像命令

    原文:docker (2) 通用/镜像命令 Docker 的常用命令: (1)Docker  help 命令: 可以查看有关docker的所有操作命令: (2)docker COMMAND -–hel ...

  8. 成都Uber优步司机奖励政策(2月25日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. 【机器学习笔记】循环神经网络RNN

    1. 从一个栗子开始 - Slot Filling 比如在一个订票系统上,我们的输入 "Arrive Taipei on November 2nd" 这样一个序列,我们设置几个槽位 ...

  10. day 3 创建窗口,移动-函数版

    1.创建窗口 #-*- coding:utf-8 -*- import pygame import time def main(): #1.创建窗口 screen = pygame.display.s ...