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. 公网k8s

    dm :32750/swagger/ 统一在   cd /opt/iot 删除容器,自动创建容器 dm 更新dm和acl包  dm源文件chart包   cd /var/lib/helmrepo/ h ...

  2. 关于Java中StringBuffer的capacity问题

    从API查到capacity的作用是查看StringBuffer的容器容量是多少,刚开始纳闷这个跟length的区别在哪?试验了几次感觉有点不解.所以直接跟进源码分析. 直接通过new StringB ...

  3. 深入理解Java虚拟机6-chap8-9-斗者3星

    一.虚拟机字节码执行引擎 1.虚拟机执行引擎由自己实现,所以可以自行制定指令集与执行引擎的体系结构,并且可以执行那些不被硬件直接支持的指令集格式. 2.执行引擎 编译执行:通过JIT编译器产生本地代码 ...

  4. 记录Ok6410 sd 启动uboot

    1\参考资料https://github.com/SeanXP/ARM-Tiny6410/tree/master/no-os/sd-no-os/u-boot 2\参考资料https://blog.cs ...

  5. fabric 更详尽的用法

    项目发布和运维的工作相当机械,频率还蛮高,导致时间浪费在敲大量重复的命令上. 修复bug什么的,测试,提交版本库(2分钟),ssh到测试环境pull部署(2分钟),rsync到线上机器A,B,C,D, ...

  6. .net MVC4一个登陆界面加验证

    Model using System; using System.Collections.Generic; using System.IO; using System.Linq; using Syst ...

  7. sqlserver with(nolock)

    所有Select加 With (NoLock)解决阻塞死锁 在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...

  8. 第五讲 DOM基础

    DOM基础: 什么是DOM:其实就是dovument,div获取.修改样式等等,但是不只是js的组成部分,而且还是一套规范,规定了这些浏览器怎么处理这些操作: 浏览器支持情况:IE(IE7-8,10% ...

  9. Spring笔记 #02# 利用切面和注解校验方法参数

    例子还是之前的例子.仍然是对mage进行法术攻击时的咒语进行校验,不过略微提高了扩展性. 应用示例 1.在.properties文件中定义参数格式(正则): sp1=^\\D*hello\\D*$ s ...

  10. CNN - 卷积神经网络

    例:  卷积公式: 卷积和卷积没有什么特别的关系,只是计算步骤比较像,成为卷积神经网络名字的由来. 感受野:单个感觉神经元的感受野是感觉空间的特定区域(如体表或视野),在这个区域内,刺激会改变神经元的 ...