VS编译生成解决方案失败,但是检查源码完全正常的奇异现象
作者:C/S框架网  发布日期:2015-01-23 02:22:35
  VS编译生成解决方案失败,但是检查源码完全正常的奇异现象


问题说明:

   A.DLL 文件内定义了接口I.Do(int a);方法,发布给宿主H程序使用,编译后没有问题运行正常。然后修改了I.Do方法,假设为:I.Do(int a, int b); 再次发布A.DLL到宿主程序H,在宿主程序内修改了相关的调用Do的方法,再次编译H程序,提示I.Do方法参数错误,仔细查看代码完全没有问题,相关调用的Do方法也绝对没有问题。


   虽然代码没有任何问题,使用“生成解决方案”或“重新生成解决方式”编译无法通过,按F5或Ctrl+F5启用高度模式偶尔能正常运行,再次编译又出现错误。以前发生过这种情况,大致问题是VS使用了DLL缓存文件(副本),清除解决方案或者手工删除相关DLL文件就能解决。但是今天发生的编译错误截然不同,无论使用以前使用过的方法都没有效果。

   直觉认为是程序问题而钻了牛角尖,花了半天时候在找原因.

   最后找到问题根源:解决方案内引用了X.DLL, 而X.DLL引用了A.DLL,每次编译的时候会从X.DLL所在目录复制X.DLL及所有它的引用相关DLL(包括A.DLL)到Debug目录,因此每次编译后VS加载的是旧DLL内I.Do(int a)方法!


PS: 其实使用手工删除相关DLL文件能解决问题的,由于X.DLL是服务端的文件,压根没想到此问题是服务端关联引起的。


解决方案:

1. 若要引用其它项目的DLL,必须将DLL文件复制到Debug目录,引用debug目录下的DLL.

2. 删除与本程序相关联的DLL(第3方组件除外),重新编译.



我们解决程序错误常用几种方法:

1. 经验,曾经遇到过此问题的解决方案。
2. 排除法,若N个替在问题无法确定时适合使用。
3. 网上找解决方案。
4. 检查源码,逐步解决,这种作法最苦逼。




上一篇 下一篇