bin 与 obj

 bin 目录:用来存放编译的结果。      ( bin是二进制binrary的英文缩写,因为最初C编译的程序文件都是二进制文件 )

    编译的结果,有 Debug 和 Release 两个版本,分别对应的文件夹为bin/Debug和bin/Release,这个文件夹是默认的输出路径。    (我们可以通过:项目属性—>配置属性—>输出路径来进行修改)

 obj 目录:用于存放编译过程中生成的中间临时文件。      ( obj是object的缩写 )

    同样具有 debug 和 release 两个子目录。

  debug 和 release 分别对应调试版本(debug)和发行版本(release)。

  在.NET中,编译是分模块进行的。每次编译时,默认都是采用增量编译,即只重新编译改变了的模块,obj 目录中保存了每个模块的编译结果,用来加快编译速度。编译整个完成后会合并为一个.DLL或.EXE保存到 bin 目录下。

  (是否采用增量编译,可以通过:项目属性—>配置属性—>高级—>增量编译来设置)

既然 obj 是中间代码的目录,为什吗还要 release 呢?同理,既然 bin 是放最终代码的目录还要 debug 干什吗?不是多此一举吗?

  编译一个源程序文件,是一个对文件多次扫描的过程,要经过语法、类型,甚至要判断执行时的可行性等。最后还有代码优化的过程。会有一大堆的中间文件产生。

  再复杂点,一个project有图片(声音)等资源文件,要调用其他DLL类库(可能是.net组件,可能是com),还可能由多个.cs文件组成。

  结论:编译需要大量的中间文件存放临时结果,为下一步做准备。  C#是面向对象的,复杂度更高!obj目录就是用来存放临时文件的!

Debug 与 Release

  release 和 debug 是不同的运行方式。

  Visual Studio 项目对程序的发布版本和调试版本分别有单独的配置。

  顾名思义,生成调试版本的目的是用于调试,而生成发布版本的目的是用于版本的最终分发。

  debug 会增加调试代码,方便调试。  调试完后,用 release 版本发布 —— 没有调试代码,减小程序体积,加快执行速度!

 debug 调试:

   你在程序中设置了断点,为什么vs.net知道在那里要停下来?当你把鼠标移到某个变量上,vs.net就会显示它当时的值?—— 因为编译器在代码中添加了许多调试需要的代码,可以让vs.net得到,返回给你。

   这些代码当然是要占用空间和时间的。

   Debug 为调试版本,其中包括了出错时能够定位源代码的在行,如果源文件已经改变,定位出来会有偏移,而且,在这个版本中编译器不会进行代码优化,

 Release 发布:

   在你的程序调试完了后,可以正确运行了。完全可以去掉这些代码,这时候就应该用 Release 模式了。

   Release 为正试版本,程序出错只是进行简单的错误处理,编译器会优化代码,以提高性能。

   Release 代码更小,执行更快,编译更严格,编译的过程也更慢。

 编译:

   不管 Debug 还是 Release 模式,都要编译(一个用于调试,一个用于发布),两种模式编译的结果,分别放在 bin 目录下的 Debug 和 Release 文件夹中。

   两种模式在编译的过程中都有中间临时代码产生,所以 obj 目录下也有 debug、release 目录,分别用于存放两种模式编译过程中生成的中间临时代码。

   编译完后,中间临时代码是没什么用的了,所以一般不管obj目录里的东西!

经常你会遇到 Debug 成功,但是 Release 版本就有问题,以下是问题的分析总结、Debug 和 Release 版本差异及调试相关问题:

一、内存分配问题

  1、变量未初始化。

  下面的程序在debug中运行的很好。

thing * search(thing * something)
BOOL found;
for(int i = ; i < whatever.GetSize(); i++)
{
  if(whatever[i]->field == something->field)
  {
    found = TRUE;
    break;
  }
}
if(found)
return whatever[i];
else
return NULL;

  而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构初始化。

2.  数据溢出的问题

二、DLL的灾难

  人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说(http://msdn.microsoft.com/library/techart/dlldanger1.htm)。

  如果你的程序使用你自己的DLL时请注意:
    1. 不能将 debug 和 release 版的 DLL 混合在一起使用。debug 都是 debug 版,release 版都是 release 版。
    解决办法是将 debug 和 release 的程序分别放在主程序的 debug 和 release 目录下

更多参考:

  https://www.cnblogs.com/Interkey/p/3554588.html

  https://www.cnblogs.com/lxconan/p/difference-between-debug-and-release-build-on-speed.html

PRoperties 文件夹以及各种后缀文件的所表示的意思

  PRoperties文件夹:定义你程序集的属性。(项目属性文件夹,一般只有一个 AssemblyInfo.cs 类文件,用于保存程序集的信息,如名称,版本等,这些信息一般与项目属性面板中的数据对应,不需要手动编写)

  .cs :类文件。   源代码都写在这里,主要就看这里的代码。
  .resx :资源文件。 一些资源存放在这里,一般不需要看。
  .csproj :C#项目文件。  用VS打开这个文件就可以直接打开这个项目,自动生成,不需要看。
  .csproj.user 是一个配置文件,自动生成的,会记录项目生成路径、项目启动程序等信息。也不需要看。
  .Designer.cs 设计文件,自动生成,不需要看。
  .aspx 是网页文件,HTML代码写在这里面。
  sln:在开发环境中使用的解决方案文件。它将一个或多个项目的所有元素组织到单个的解决方案中。此文件存储在父项目目录中.解决方案文件,他是一个或多个.proj(项目)的集合
  *.sln:(Visual Studio.Solution) 通过为环境提供对项目、项目项和解决方案项在磁盘上位置的引用,可将它们组织到解决方案中。
  比如是生成Debug模式,还是Release模式,是通用CPU还是专用的等

.NET:bin 与 obj,Debug 与 Release ,区别与选择的更多相关文章

  1. 细说Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  2. 【转】Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  3. Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  4. VC Debug和Release区别

    https://msdn.microsoft.com/en-us/library/xz7ttk5s.aspx   Optimizing Your Code Visual Studio 2015 The ...

  5. VC下Debug和Release区别

    整理日: 2015年3月23日 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到 ...

  6. C#数组大小分析(附测试过程中想起的debug和release区别)

    C#数组的理论最大长度到底是多少呢?曾经一度问过度娘,谷歌,貌似都没有得出一个比较准确的答案,无外乎是什么Int32的最大值啊什么的,今天终于决定写个软件来自己测试一下,在几台不同的电脑里面实际测试看 ...

  7. Debug和Release区别(转)

    地址:https://zhidao.baidu.com/question/629188090208609884.html 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题 ...

  8. OpenCV在debug和release模式下选择不同的lib静态库文件

    这两天测试OpenCV显示到MFC的Picture控件上,终于测试成功了,但是换到release模式下就会imread失败.发现问题是导入的lib问题. 因为VS如果通过Property Manage ...

  9. Xcode DEBUG宏定义,debug和release模式的选择

    设置DEBUG, 使用宏定义: #if DEBUG NSLog(@"debug model"); #else //执行release模式的代码 #endif

  10. 关于C#Debug和Release

    在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使 ...

随机推荐

  1. 一个少女心满满的例子带你入门canvas

    https://blog.csdn.net/sunshine940326/article/details/76572850 本文首发于我的个人博客:http://cherryblog.site/ gi ...

  2. Redis入门到高可用(二十)——Redis Cluster

    一.呼唤集群 二.数据分布概论      三.哈希分布 1.节点取余 2.一致性哈希 添加一个node5节点时,只影响n1和n2之间的数据   3.虚拟槽分区 四.基本架构 五.redis clust ...

  3. java框架之Spring(5)-注解驱动开发

    准备 1.使用 maven 创建一个 java 项目,依赖如下: <dependency> <groupId>org.springframework</groupId&g ...

  4. 外网无法ip访问服务器解决方法 (原)

    示例ip:119.75.1.1      windows server示例 一.检查网络是否通畅     打开dos窗口(windows+r , 输入cmd回车  )输入命令: ping 119.75 ...

  5. XML DOM 节点类型(Node Types)

    节点类型 下面的表格列出了不同的 W3C 节点类型,以及它们可拥有的子元素: 节点类型 描述 子元素 Document 表示整个文档(DOM 树的根节点) Element (max. one) Pro ...

  6. JAVA 重写equals和重写hashCode

    面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” 首先你需要了解: hashCode()的作用是获取哈希码(散列码) 它实 ...

  7. 为什么入门首选C语言

    对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解C的程序员. C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在 ...

  8. Linux文件检索

    title: Linux文件检索 date: 2017-12-11 19:03:01 tags: linux categories: linux whereis 只要执行 whereis ls 就可以 ...

  9. Zookeeper应用之——队列(Queue)

    为了在Zookeeper中实现分布式队列,首先需要设计一个znode来存放数据,这个节点叫做队列节点,我们的例子中这个节点是/zookeeper/queue. 生产者向队列中存放数据,每一个消息都是队 ...

  10. Poj1979 Red and Black (DFS)

    Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 47466   Accepted: 25523 D ...