三步快速解决dll冲突问题

最近在推广应用我们的分布式服务网关(Web Api):业务组大部分对外的业务逻辑以HSF服务或者自定义扩展插件的方式,注册并发布到分布式服务网关中,统一对外提供WebApi服务。临时介绍下我们的分布式服务网关:

1. 一键注册、发布WebApi服务,

2. 统一管理发布WebApi服务,实现WebApi的服务化治理

3. 集成安全认证、加解密、监控、日志等Aspect

4. 流量安全控制:流控

5. 横向伸缩、弹性扩展,支持大规模并发

6. 简化WebApi开发,提升开发效率,减少重复开发工作

在实际的开发应用中,业务逻辑dll要注册、发布到分布式服务网关中,例如参数类型、自定义扩展插件等。

每次业务的变更,都需要重新发布服务,例如实体类的注解(属性标签)发生变化,重新发布服务,分布式服务网关侦测到变化,重新加载。

同时,各个业务模块之间存在SPI层接口、实体类的依赖,例如:A中依赖B.Spi.dll, B发布了最新的B.Spi.dll, A未发布,这样会产生一个问题:

一个AppDomain中只能加载一个B.Spi.dll,如果先访问A服务,那么旧版本的B.Spi.dll就会先加载到AppDomain,此时,访问B服务时,就会出现dll冲突问题:

例如:

{"ErrorInfo":"数据序列化错误:程序集“***.Module.CarMdelAnalyse.SPI, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的类型“***.Module.CarMdelAnalyse.SPI.CarModelAnalyseResult”未标记为可序列化。r\rn   在 System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type)\r\n   在 System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context)\r\n   在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo()\r\n   在 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)\r\n   在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Write(WriteObjectInfo objectInfo, NameInfo memberNameInfo, NameInfo typeNameInfo)\r\n   在 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)\r\n   在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)\r\n   在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)\r\n  

类似的错误还有:

未能加载文件或程序集“***.dll”或它的某一个依赖项

运行时如何快速定位到dll 冲突的根本原因,找到到底加载的dll是在GAC中、还是Bin中、还是指定目录中的dll?

有经验的老司机,分享给大家一个三步法,屡试不爽!!!

1. 找到程序主进程,右键:Create Dump File,如果IIS站点:指定应用程序池下的w3wp进程,如果自己的服务进程,直接找进程即可

2. 安装指定版本的Windbg(X86\X64), Ctrl+D 加载第一步抓的Dump文件,.loadby sos clr  -> !dumpdomain

3. 找到相关的dll文件路径,ILSpy,反编译定位问题,解决。

show:

1. 抓dump:通过上面的错误堆栈,我们定位到w3wp.exe,  右键创建转储文件

2. 安装Windbg, 请根据程序的32/64版本下载安装不同的Windbg,我们用的64位,因此用的Windbg是X64版本的。打开windbg,Ctrl+D, 加载刚才抓的dump文件

依次输入命令:.loadby sos clr  -> !dumpdomain

得到domain信息输出:

以ServiceStack.Redis.dll这个dll为例,可以找到在哪个路径下加载的dll:类似的找业务相关的dll即可:

3. 找到AppDomain加载的dll,拷贝,ILSpy:

windbg的确在内存镜像分析时是一个利器,赞一个!

周国庆

2017/4/23

时间: 2024-10-13 03:43:01

三步快速解决dll冲突问题的相关文章

C#通过外部别名,解决DLL冲突问题

今天遇到一个有两个DLL文件,命名空间,部分类名与部分方法名一样,但是方法的功能实现不一样.调用方法时,无法调用指定DLL的指定方法.在网上找了好多,简单总结一下. 1.首先添加引用,不细说. 2.右击添加后的引用,选择属性. 3.将别名global修改为你想要的内容,如:"TestDll" 4.在程序最上方添加 extern alias TestDll; 5.直接用别名声明. 大功告成.

开启VMware虚拟机电源时,提示“内部错误”,"三步走"解决

首先出现VMware打开虚拟机错误问题,一般总体归结为:VMware软件本身问题(是否正常启动,服务是否全部开启):虚拟机文件问题(异常断电等):系统权限问题(是否有管理员权限打开):按照这个思路来一步一步排除. (1)突然出现这种问题,首先确保VMware程序安装没有问题,多打开几个虚拟机,如果都出现这样的提示,那么很可能是虚拟机软件问题,排除虚拟机文件错误. (2)其次查看VMware服务,打开任务管理器 如果服务有不正常的,处理服务.如上图服务全部正常,尝试全部重新启动,重新启动后还是提示

三步快速搭建android开发环境 (下载包已集成可用sdk,无需费心到google相应网站下载,快哉!)

http://blog.csdn.net/king_sundi/article/details/24901849 其中,adt buntle在这里下: http://blog.csdn.net/LANG791534167/article/details/45061509 找到这个: adt-bundle-windows-x86_64-20140321.zip 510.0M Android 4.2(4.4?)多合一开发包, 注意所含eclipse是64位的. 

三步解决EntityFramework Code First中的MissingMethodException错误

在数据库初始化时运行OnModelCreating的方法中,有时会抛出MissingMethodException异常. 以下三步可解决大部份的出错场景: 在程序包管理器控制台中运行:Uninstall-Package EntityFramework 在packages文件夹中删除 EntityFramework 文件夹 在程序包管理器控制台中运行:Install-Package EntityFramework 本人的环境为VS2015社区版,.net framework 4.5,EntityF

设置IIS网站输出详细错误,共三步

默认IIS网站程序出错时,只显示错误提示没有错误详细说明,通过以下三步来解决此问题: 一.ASP类型网站,需要设置“将错误发送至浏览器”,见下图: 二.设置500错误时,要显示详细错误,见下图: 三.确保本地浏览器没有选中“显示友好HTTP错误消息”,位于“internet属性”内---“高级”标签,见下图: 原文地址:https://www.cnblogs.com/wm218/p/12204748.html

快速入门git第三步

安装:一.在linux ubuntu 上安装git sudo apt-get install git配置:二.初次运行git的配置,为什么是初次,因为更新或升级都会沿用老的git的配置, 可以用相同的命令进行了配置的修改, git 提供了一个工具git config ,专门用来配置或读取相应的环境变量,不同的环境变量导致了git在各个环节的具体工作方式和行为,环境变量存放在三个地方:/ect/config: 系统中对所有的用户都普遍使用的配置-/config: 只是适用与当前用户的配置.git/

.Net中DLL冲突解决 【转帖】

转自:http://www.cnblogs.com/HQFZ/p/5000038.html 最近在编译AKKA.net 时出现了一个问题: Newtonsoft.Json.dll 冲突. C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1819,5): warning MSB3243: No way to resolve conflict between " Newtonsoft.Js

.Net中DLL冲突解决(真假美猴王)

<西游记>中真假美猴王让人着实难以区分,但是我们熟知了其中的细节也不难把他们剥去表象分别出来.对问题不太关心的可以直接调到文中关于.Net文件版本的介绍 问题 最近在编译AKKA.net 时出现了一个问题:Newtonsoft.Json.dll 冲突. C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(1819,5): warning MSB3243: No way to resolv

JQuery的$和其它JS发生冲突的快速解决方法

众所周知,jQuery是目前最流行的JS封装包,简化了很多复杂的JS程序,JQuery讲浏览器DOM树定义为$,通过$来获取各个子节点. 然后,JS插件并非只有JQuery,还有prototype.js 等其它比较好的插件.它们也使用$.所以有时候同时使用这个两个JS插件的时候,就会出现$的使用权冲突问题.现在我们来看看如何解决这个冲突问题.请看下文: 我们都知道JQuery有一个函数,jquery.noConflict() 它的作用是讲$的控制权转让出去.然后我们可以通过jQuery代替$来获