现象

最近在工作中遇到了一次奇怪的编译出错。事情是这样的,本来这个asp.net webform应用是可以编译的。但是将另外一个class library的工程加入到这个asp.net webform应用的引用中,还未改任何其它的代码。这个asp.net webform应用就出现了编译错误。分析这些编译出错的地方,再看了SVN历史,这些文件最近都没有改过(最近一次改动是六月的事情了),但是这些文件确实是编译有错。有点奇怪。一时想不出来为什么。等到第二天,继续分析,突然发现引起编译出错的类型是属于这个新加入引用的工程。看了编译出错的代码,其并没有引入任何新加入引用的工程任何名称空间。这就奇怪了。还没有引入其任何名称空间,只是把引用刚加上就出了编译出错。这个asp.net webform工程原来是可以编译的,为什么会加入一个引用后就不能编译了呢?会不会去掉引用还是能编译?于是试着去掉了这个新加的引用。编译。果然可以编译。之前出错的地方不再出错了。看了一下那些之前出错的类型,发现居然是另外一些在本来asp.net webform工程里的一些类,并不是新加工程里的类。而且这些类都有名称空间。这就奇怪了,为什么加入引用之后,这些类就变成了新加工程里的类呢?打开了新加工程里的类,仔细看了一下,发现了一个问题,即该类没有定义名称空间,同时该类的名字与asp.net webform工程里的类同名。这就是为什么这些没有名称空间的类会引起编译错误的原因了。当.net compiler定位一个类时,如果有两个类同名,一个类有名称空间,另一个没有。.net compiler优先搜索没有名称空间的类,然后再去搜索有名称空间的类。原来的程序引用的是有名称空间的类,没有加入新引用时一切都没有问题。当加入引用时,而且新的类没有名称空间,刚好可以把原来的有名称空间的类替换掉。.net compiler优先搜索到这个没有名称空间的类,从而引起原来的程序出错。因为原来有名称空间的类已经变了,换成这个没有名称空间的类。既然找到了原因,那么解决办法就简单了。

解决方案

原因已经清楚了。解决办法包括:

1. 给那些没有名称空间的类加上名称空间

这个在实际情况中无法做到,这个新工程是由专人负责的。不能去改。

2. 给现有代码强行加上全名称空间+类名的引用方式

这种办法技术上是可行,但是会引起代码看起来很恐怖。也不打算采用。

3. 实际的解决方式:

给那位专人指出这个问题,然后去掉对新工程的引用。因为其引起已有工程编译出错。然后在已有工程里照搬了新工程里几个类,写了一些Mock up(假的实现)。等那位专人解决这个问题之后再进行合起来的编译。

由一次奇怪的编译出错想起的相关推荐

  1. 杀毒软件引起的WinCE编译出错问题

    最近发现选择PB6.0的Rebuild Current BSP And Subprojects来编译整个BSP包的时候,基本都会弹出下面的编译出错信息: 图1 刚开始还以为是VS2005出问题了,就关 ...

  2. 编译安装gcc-4.8.2(编译出错后修改源码 编译成功)

    记录 下载 wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz 解压 下载依赖 tar zxf gcc-4.8.5.tar.gz cd ...

  3. cmake编译出错:No CMAKE_CXX_COMPILER could be found.

    cmake编译出错:No CMAKE_CXX_COMPILER could be found. 错误类似: -- The CXX compiler identification is unknown- ...

  4. Xamarin.iOS编译出错

    Xamarin.iOS编译出错 错误信息:C:/Program Files(x86)/Reference Assemblies/Microsoft/Framework/Xamarin.iOS/v1.0 ...

  5. 编译出错libicui18n.so.58: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8‘

    编译出错libicui18n.so.58: undefined reference to `__cxa_throw_bad_array_new_length@CXXABI_1.3.8' 环境 Ubun ...

  6. android 模块不编译错误,Android 编译出错版本匹配问题解决办法

    Android 编译出错版本匹配问题解决办法 解决问题的关键在于版本匹配, compileSdkVersion compileSdkVersion targetSdkVersion 这三个参数的整数值 ...

  7. saki4510t的UVCCamera设置匹配android7.1.1 sdk等信息后编译出错

    采用的代码来之于https://github.com/saki4510t/UVCCamera 此工程Sdk等版本信息定义 1.1 minSdkVersion 1.2 targetSdkVersion ...

  8. 解决WINCE6.0新建工程编译出错的问题

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  9. codeblocks c++ 编译出错

    codeblocks编译出错 今天编译一个c++程序调用模板的时候,出现错误 error This file requires compiler and library support for the ...

最新文章

  1. 【工程化】从0搭建VueJS移动端组件库开发框架
  2. 新手如何快速上手Linux,韦东山告诉你。
  3. matlab imfinfo返回图像信息
  4. java获取网络图片_有了这50套Java毕设项目(源码 案例),offer拿到手软,无偿分享...
  5. Oracle笔记:创建表空间、创建用户、授权
  6. MyBatis学习 之 三、动态SQL语句
  7. 怎样获取php页面get的值,PHP循环获取GET和POST值的代码
  8. pwershell custom objects
  9. 电子表格和oracle,##请问数据库和电子表格之间有什么区别
  10. 想加入一行代码吗?使用code标签
  11. 团“模子”政策模式乱舞
  12. 【图像去雾】基于matlab直方图+retinex+暗通道图像去雾【含Matlab源码 074期】
  13. OpenGL编程指南随书代码在VisualStudio2019的运行方法
  14. 自主导航系列21-layered论文阅读
  15. MySQL的一级索引和二级索引介绍
  16. 网络封包分析软件-WildPackets OmniPeek Workgroup Pro
  17. 三面阿里云计算,出门我就哭了!(Java研发岗,还原真实“被虐”场景)
  18. 【读书笔记】《学会提问》——受用一生的批判性思维
  19. 指纹识别综述(8): 唯一性
  20. Docker各操作系统安装方式及优缺点

热门文章

  1. thinking in object pool
  2. mass Framework pagination插件
  3. BZOJ4890 洛谷3761:[TJOI2017]城市——题解
  4. jQuery Mobile手机网站案例
  5. 修改普通用户加入域的次数
  6. 《Hadoop技术详解》一导读
  7. SwipeRefreshLayout 报错 dispatchTouchEvent
  8. LR11之web_reg_find文本检查点的使用
  9. java面试基础问题积累----多线程,并发
  10. PHP接收上传的文件