我在Visual Studio 2010中创建了一个新项目,并注意到现在在我的项目目录中有两个名为obj和bin的新文件夹。

在构建和调试时创建了一对类似的文件夹——这些文件夹用于什么?


obj目录用于存放编译器或构建系统在构建过程中生成的中间对象文件和其他临时数据文件。bin目录是将最终输出二进制文件(以及任何依赖项或其他可部署文件)写入的目录。

如果您愿意,可以在项目设置中更改用于这两个目的的实际目录。


obj文件夹保存对象文件或中间文件,这些文件是尚未链接的编译二进制文件。它们本质上是将组合在一起生成最终可执行文件的片段。编译器为每个源文件生成一个目标文件,这些文件被放入obj文件夹中。

bin文件夹保存二进制文件,这些文件是应用程序或库的实际可执行代码。

这些文件夹中的每一个都被进一步细分为Debug和Release文件夹,它们仅仅对应于项目的构建配置。上面讨论的两种类型的文件被放置到适当的文件夹中,这取决于您执行的构建类型。这使得您可以很容易地确定哪些可执行文件是用调试符号构建的,哪些是用启用了优化并准备发布的优化构建的。

注意,您可以在项目的Properties中更改Visual Studio在编译期间输出可执行文件的位置。您还可以更改构建配置的名称和所选选项。


关于obj目录有一个有趣的事实:如果你在web项目中设置了发布,将发布的文件将暂存到obj\Release\Package\PackageTmp。如果你想自己发布文件,而不是使用集成的VS特性,你可以在这里获取你实际需要部署的文件,而不是在bin目录中挑选所有的数字碎片。


我建议你看看这个youtube视频,它演示了c# bin和obj文件夹之间的区别,并解释了我们如何获得增量/条件编译的好处。

c#编译是一个两步的过程,详见下图:

编译:在编译阶段,单独的c#代码文件被编译成单独的编译单元。这些单独编译的代码文件放在OBJ目录中。 链接:在链接阶段,这些单独编译的代码文件被链接以创建单个单元DLL和EXE。这将进入BIN目录。

如果你比较bin和obj目录,你会发现“obj”目录中有更多的文件,因为它有单独的编译代码文件,而“bin”只有一个单元。


如果你正在使用安装项目,要小心;Visual Studio设置项目的Primary Output是从obj文件夹而不是bin文件夹中提取的。

我正在发布应用程序,我认为是混淆和签名在msi设置之前,我发现部署的应用程序文件实际上既没有混淆也没有签名,因为我在bin文件夹程序集上执行后构建过程,应该针对obj文件夹程序集而不是。

这远不是直观的imho,但一般的设置方法是使用项目的Primary Output,这是obj文件夹。顺便说一句,如果有人能解释一下,我会很高兴。