debug - C#低版编译的exe使用高版本的FrameWork有莫名的问题

前言

今天,帮同时解决现场的问题。已经定位了出问题的C#exe.
这个C#exe有年头了,而且没源码,只能拿dnSpy单步调试。
问题描述(伪码):

try {
	p_node = new xx; // new一个节点出来
	 key_new = key; // 将key复制给一个中间变量,key类型为int
	 // 但是如果key 末尾4位10进制数为0346, key_new的值就是0,而不是key
	 if (my_hash_map_have_not_key(key)) {
	 // 这里判断的是key, 而不是key_new
	 // 导致插入多个末尾为0346的十进制数时,实际上插入key = 0的多个node, 导致抛异常
	   add_to_hash_map(key_new, p_node);
	   // 其他业务逻辑
	   // 抛异常后,这些后续的业务逻辑就不被执行了
}
catch () {
// ...
}
}
 

问题分析:
这已经不是代码实现的问题,莫名不可描述的原因。
比对环境,唯一可疑的地方,就是这个C#exe,是很久以前写的,有可能是用vs2010C#写的。
发布版其他C#程序,用的都是vs2017C#编译的。
因为C#程序编译出来都是中间层的代码,最后要调用FrameWrok去干活。
那旧版程序调用新版的FrameWrok, 就有可能有问题。
一般新版程序使用旧版的组件,可能还好点。因为编译器开发厂商,会考虑兼容性问题。
如果旧版程序使用新版组件,这个编译器开发厂商是考虑不到的。除非接口和功能完全不变。

解决问题的方法:

  • 去找到这版工程,用vs2017重新编译一版。
  • 用C#反汇编工具,反一个工程出来,正向编译时,消掉编译错误,再编译一个vs2017编译的新版C#exe出来。
发布了436 篇原创文章 · 获赞 126 · 访问量 175万+

猜你喜欢

转载自blog.csdn.net/LostSpeed/article/details/95229564