.NET:bin 与 obj,Debug 与 Release ,区别与选择
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 ,区别与选择的更多相关文章
- 细说Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- 【转】Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- VC Debug和Release区别
https://msdn.microsoft.com/en-us/library/xz7ttk5s.aspx Optimizing Your Code Visual Studio 2015 The ...
- VC下Debug和Release区别
整理日: 2015年3月23日 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到 ...
- C#数组大小分析(附测试过程中想起的debug和release区别)
C#数组的理论最大长度到底是多少呢?曾经一度问过度娘,谷歌,貌似都没有得出一个比较准确的答案,无外乎是什么Int32的最大值啊什么的,今天终于决定写个软件来自己测试一下,在几台不同的电脑里面实际测试看 ...
- Debug和Release区别(转)
地址:https://zhidao.baidu.com/question/629188090208609884.html 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题 ...
- OpenCV在debug和release模式下选择不同的lib静态库文件
这两天测试OpenCV显示到MFC的Picture控件上,终于测试成功了,但是换到release模式下就会imread失败.发现问题是导入的lib问题. 因为VS如果通过Property Manage ...
- Xcode DEBUG宏定义,debug和release模式的选择
设置DEBUG, 使用宏定义: #if DEBUG NSLog(@"debug model"); #else //执行release模式的代码 #endif
- 关于C#Debug和Release
在程序调试时的debug和release 网上有如下的描述:Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使 ...
随机推荐
- ORACLE结构体系篇之表空间详解.md
表空间详解一.系统表空间SYSTEM 表空间是Oracle 数据库最重要的一个表空间,存放了一些DDL 语言产生的信息以及PL/SQL 包.视图.函数.过程等,称之为数据字典,因此该表空间也具有其特殊 ...
- 一个少女心满满的例子带你入门canvas
https://blog.csdn.net/sunshine940326/article/details/76572850 本文首发于我的个人博客:http://cherryblog.site/ gi ...
- Redis入门到高可用(二十)——Redis Cluster
一.呼唤集群 二.数据分布概论 三.哈希分布 1.节点取余 2.一致性哈希 添加一个node5节点时,只影响n1和n2之间的数据 3.虚拟槽分区 四.基本架构 五.redis clust ...
- vue-cli 2.92版本 没有dev.server.js
在webpack.dev.conf.js 文件中 //首先 const express = require('express') const app = express() var appData = ...
- 事件冒泡以及onmouseenter 和 onmouseover 的不同
1. onmouseenter onmouseenter 事件在鼠标指针移动到元素上时触发. 该事件通常与 onmouseleave 事件一同使用, 在鼠标指针移出元素上时触发. onmouseent ...
- javascript时间处理
1.将一般格式时间转换为时间戳: var systime = "2018年04月28日 16:01:09"; systime = systime.replace('年', &quo ...
- CSS 组合选择器
CSS 组合选择器 注:使用逗号分隔,同时应用. 多个id选择器拼接到一起 含有:i1 i2 i3的标签同时应用css样式. <html> <head> <!-- sty ...
- centos 安装php laravel框架
centos6 安装 laravel 1 环境要求,lnmp(php5.4以上,重要的事情说三遍) 2 安装Composer curl -sS https://get****composer.org/ ...
- D4 树的直径、重心以及基环树
第一题第二题鉴上我前几篇博客poj1985 poj1849:https://www.cnblogs.com/Tyouchie/p/10384379.html 第三题:数的重心:poj1655 来自sj ...
- element-ui checkbox传默认值的问题
新入职一家公司了,准备把项目中遇到的问题随时记录下来.以前遇到的问题解决了没有记录,导致面试的时候问项目中遇到那些问题时,好多都忘了. 今天记录一下element-ui 的 checkbox 传递默认 ...