巧用「嵌入资源」和「动态加载程序集」解决依赖库版本冲突

作者:V君 发布于:2017-4-1 14:39 Saturday 分类:填坑经验

太短(?)就不写摘要了 (´∀((☆ミつ


一个老项目,使用了 .net 3.5,框架体系中已经引用了较早期的 Newtonsoft JSON 库

它的版本也是3.5现在这个库已的版本已经到10.0了

和旧版比起来有一些命名差异以及修复了一些 bug,需要的功能正好在被修复的 bug 里


我们都知道如果一个项目里不同的程序集之间引用不同版本但名称相同的程序集会出现冲突


尽管可以重定向程序集版本,但是那时还没啃透

不知道除了能代替版本还能指定另一个文件,这种方式也是可以解决问题的(MSDN)这是后话


回到我们这次的做法

新版本的 DLL 没跑进 bin试着手动复制进去(当然已经改过文件名再引用),发现启动不了

这是当然的,WEB 项目会无脑的把bin里的程序集全部都加载起来,发现同程序集名不同版本就挂了


于是就用了 Aio1ef 那招

 -- 引用时去掉本地复制,在首次使用前于静态构造加挂程序集解析事件,载入嵌入程序集


于是就让两个不同版本的 Newtonsoft JSON 共存了

当然目前只是在这个项目里的不同程序集分别引用


要在同一个程序集里引用两个名称相同,版本却不同的程序集

在没有用到 Attribute 的前提还是可以勉强反射一下实现写个类 Proxy 也是挺有意思的

如果有用到 Attribute 那就洗洗睡吧, 那估计要用 IL 显式指定程序集名称了 乂目


标签: 软件开发 C#

评论(0) 引用(0) 浏览(1671)

使用Debug Diagnostic Tool分析.net转储

作者:V君 发布于:2016-10-25 11:26 Tuesday 分类:填坑经验

TL;DR:

去M¥官网下载该工具, 对应其x86/x64. 安装时选择关联文件类型. 

装好之后双击要分析的dmp文件. 等一会儿. 一个可视化的mht分析报表就出来了.

注意这工具只能在Vista(NT6)以上环境运行.


转储dmp文件可以用Sysinternals出品的免费系统工具Process Explorer来做.


听我扯扯:

虽然WinDbg+sos/sosex很强大, 但是用起来很复杂, 载入符号也很慢.

于是找到了这货来帮忙, 尽管和前者比起来就差不能在内存中找对象.

但是非常方便收集异常信息以及线程堆栈.

标签: 软件开发 C# 调试技术 windbg

评论(0) 引用(0) 浏览(1850)

RawCap抓包工具也不是万能的

作者:V君 发布于:2016-4-5 11:09 Tuesday 分类:填坑经验

TL;DR: 官方网站已经明确, 在XP之后的Windows上有以下限制, 看来只能用作回环抓包了.

Raw sockets limitations (OS dependent)

(略过两项)

External interfaces

Microsoft's newer operating systems (later than WinXP) have limitations associated with raw socket sniffing of external interfaces, i.e. everything that isn't localhost. Known limitations in Windows Vista and Win7 are:

  • Windows 7 - Can't capture incoming packets
  • Windows Vista - Can't capture outgoing packets

Due to these limitations in the raw sockets implementations of Microsoft's current operating systems we suggest running RawCap on Windows XP if you need to capture from external interfaces.


不扯不快:

说到抓包, 大家可能第一个想到的就是WireShark. 

然而这货想抓回环包要稍稍蛋疼的配置一下才能抓, 并且略庞大.

配置页面就提到可以用RawCap轻松抓取.

 

这次环境是2003, 想抓某个服务应用程序的包做故障诊断. 

WireShark提示系统版本太低不支持, 然而老版本安装包似乎不工作...

用RawCap在上面跑, 抓完打包回传, 发现只有接收的包, 没有发送的包.

然后回来看看官网, 果然是有限制的.


看来还是要老老实实修改现有程序加上收发数据日志.

我讨厌维护陈旧的各种编码不规范且自作聪明的项目

不能因为他们那时候因对基础类库不熟悉就原谅

标签: 软件故障诊断 抓包

评论(0) 引用(0) 浏览(2821)

TCPView未能完全统计网络活动-难道Sysinternals的工具不靠谱?

作者:V君 发布于:2016-4-1 21:26 Friday 分类:填坑经验

因为Sysinternals工具套装一直给我在软件故障诊断这类问题上带来优越的体验, 

我对它的信任也逐步提升甚至达到脑残粉级别.


最近, 我用其中的TCPView诊断服务器运行情况时

发现只显示连接发起, 没有显示这个连接的发送/接收的数据包或字节.

 

于是坚信咱们的服务程序有问题, 只是连接到对方而已, 并没有吐出数据.

 

由于这是很复杂的老项目, 出问题也一下子不知道是什么地方, 

只好放一边, 联系以前负责这个项目的人, 预约个时间来一起排查.

 

动摇: 等人来的这段时间中一次偶然的在自己的本子上跑起TCPView, 

发现只有系统进程才有收发数据统计,

别的绝大多数应用进程和在服务器遇到的情况一样 -- 有连接,但显示空的收发数据包和字节数.

唯独cFosSpeed的进程是有活动的, 可能是把别的进程流量集中到一起来调整优先级.

 

结果: 约到之前负责项目的人来一起解决问题, 他在另一端启动一个Socket调试工具.

启动监听 -- 发现确实有数据过来.


好吧, 我知错了. 可能复杂的服务器环境有类似cFos一样的东西来管理流量.


并不是说TCPView不靠谱, 而是显示的是系统层面真实的连接活动情况.

只不过这些连接活动可能受到个别软件影响.导致显示出的结果和实际有差别.

遇到这个问题的人不只是我, Sysinternals官方论坛也有人提到这个现象.


标签: 软件故障诊断 TCP Sysinternals 抓包

评论(0) 引用(0) 浏览(1969)

又一个坑:分块传输编码(Chunked)

作者:V君 发布于:2015-12-18 22:48 Friday 分类:填坑经验

不知道Chunked是什么的可以看看维基百科,然后出去吧 ‘皿’  

 

由于没有请求响应长度,我大井WebRequest把ContentLength设置成-1, 

如果做了检查内容长度必须大于0 则永远不会成立条件

(↑这就是目前遇到的问题, 还是已发出的大量客户端自动更新的版本请求, 当然是前人写的)


已确认IIS吐出的响应带内容长度头, 但是复杂的服务器环境中间多了个nginx反向代理, 

是这该死的玩意把响应分块传输了. 难怪开发环境妥妥的, 发布以后却不工作.


让运维改nginx配置把Chunked关闭, 问题解决.

 

 

标签: 软件开发 C# ASP.NET MVC Chunked HTTP

评论(0) 引用(0) 浏览(1884)

Powered by emlog 去你妹的备案 sitemap