我在Visual Studio 2010中创建了一个新项目,并注意到现在在我的项目目录中有两个名为obj和bin的新文件夹。
obj
bin
在构建和调试时创建了一对类似的文件夹——这些文件夹用于什么?
obj目录用于在构建过程中由编译器或构建系统生成的中间对象文件和其他临时数据文件。bin目录是最终输出二进制文件(以及任何依赖项或其他可部署文件)将被写入的目录。
如果您愿意,可以在项目设置中更改用于这两个目的的实际目录。
obj文件夹包含对象或中间文件,这是尚未链接的编译二进制文件。它们本质上是将组合在一起生成最终可执行文件的片段。编译器为每个源文件生成一个目标文件,这些文件被放置在obj文件夹中。
bin文件夹包含二进制文件,这是应用程序或库的实际可执行代码。
每个文件夹被进一步细分为Debug和Release文件夹,它们仅仅对应于项目的构建配置。上面讨论的两种类型的文件被放置到适当的文件夹中,这取决于您执行的构建类型。这使得您可以很容易地确定哪些可执行文件是用调试符号构建的,哪些是用启用了优化并准备发布的优化构建的。
Debug
Release
注意,您可以在项目的Properties中更改Visual Studio在编译期间输出可执行文件的位置。您还可以更改构建配置的名称和所选选项。
关于obj目录有一个有趣的事实:如果你在web项目中设置了发布,将发布的文件将暂存到obj\Release\Package\PackageTmp。如果你想自己发布文件,而不是使用集成的VS特性,你可以在这里获取你实际需要部署的文件,而不是在bin目录中挑选所有的数字碎片。
我鼓励你看看这个youtube视频,它演示了c# bin和obj文件夹之间的区别,并解释了我们如何获得增量/条件编译的好处。
c#编译是一个两步的过程,详见下图:
如果你比较bin和obj目录,你会发现“obj”目录中有更多的文件,因为它有单独的编译代码文件,而“bin”只有一个单元。
如果你正在使用setup项目,请小心;Visual Studio设置项目Primary Output从obj文件夹中提取,而不是bin。
setup
Primary Output
我发布的应用程序,我认为是混淆和签名在msi设置相当长一段时间之前,我发现部署的应用程序文件实际上既没有混淆也没有签名,因为我在bin文件夹程序集上执行构建后的过程,而应该是针对obj文件夹程序集。
msi
这远不是直观的,但一般的setup方法是使用项目的Primary Output,这是obj文件夹。顺便说一句,如果有人能解释一下,我会很高兴。