.NET:bin 与 obj,Debug 与 Release ,区别与选择

bin 与 obj

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

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

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

    一样具备 debug 和 release 两个子目录。优化

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

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

  (是否采用增量编译,能够经过:项目属性—>配置属性—>高级—>增量编译来设置).net

既然 obj 是中间代码的目录,为什吗还要 release 呢?同理,既然 bin 是放最终代码的目录还要 debug 干什吗?不是画蛇添足吗?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 = 0; 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.  数据溢出的问题

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仍是专用的等

相关文章
相关标签/搜索