我在 Visual Studio 2010 中创建了一个新项目,并注意到我的项目目录中现在有两个名为 obj
和 bin
的新文件夹。
在构建和调试时会创建一对类似的文件夹——这些文件夹是做什么用的?
obj
文件夹包含对象或中间文件,它们是尚未链接的已编译二进制文件。它们本质上是片段,它们将被组合以产生最终的可执行文件。编译器为每个源文件生成一个目标文件,并将这些文件放入 obj
文件夹中。
bin
文件夹包含二进制文件,它们是您的应用程序或库的实际可执行代码。
这些文件夹中的每一个都进一步细分为 Debug
和 Release
文件夹,它们仅对应于项目的构建配置。上面讨论的两种类型的文件都放置在适当的文件夹中,具体取决于您执行的构建类型。这使您可以轻松确定哪些可执行文件是使用调试符号构建的,哪些是启用了优化并准备发布的。
请注意,您可以在项目的“属性”中更改编译期间 Visual Studio 输出可执行文件的位置。您还可以更改构建配置的名称和选定选项。
我建议您观看此 youtube 视频,该视频演示了 C# bin and obj folders 之间的区别,并解释了我们如何从增量/条件编译中获益。
C#编译是一个两步的过程,更多细节见下图:
编译:在编译阶段,单独的 C# 代码文件被编译成单独的编译单元。这些单独的编译代码文件位于 OBJ 目录中。链接:在链接阶段,这些单独的编译代码文件被链接以创建单个单元 DLL 和 EXE。这在 BIN 目录中。
https://i.stack.imgur.com/665Gd.png
如果你比较 bin 和 obj 目录,你会发现“obj”目录中有更多的文件,因为它有单独的编译代码文件,而“bin”只有一个单元。
https://i.stack.imgur.com/8IbK7.png
obj
目录用于在构建期间由编译器或构建系统生成的中间对象文件和其他临时数据文件。 bin
目录是最终输出二进制文件(以及任何依赖项或其他可部署文件)将被写入的目录。
如果愿意,您可以在项目设置中更改用于这两种目的的实际目录。
关于 obj 目录的一个有趣事实:如果您在 Web 项目中设置了发布,那么将要发布的文件将暂存到 obj\Release\Package\PackageTmp。如果您想自己发布文件而不是使用集成的 VS 功能,您可以在此处抓取您实际需要部署的文件,而不是从 bin 目录中的所有数字碎片中挑选。
如果您正在使用 setup
个项目,请小心它们; Visual Studio 安装项目 Primary Output
从 obj
文件夹而不是 bin
中提取。
在我发现部署的应用程序文件实际上既没有混淆也没有签名之前,我一直在发布我认为被混淆并在 msi
设置中签名的应用程序,因为我正在对 bin
文件夹程序集执行构建后过程,并且应该改为以 obj
文件夹程序集为目标。
这与直观的恕我直言相去甚远,但一般的 setup
方法是使用项目的 Primary Output
,这是 obj
文件夹。如果有人能对此有所了解,我会很高兴的。
obj
真的只包含 unlinked 目标代码文件吗?根据我的经验,它包含所有个文件,并且在最后的构建步骤中,属于“最终集”的文件被复制到bin
中。