obj和bin文件夹(由Visual Studio创建)有什么用?

kokeuurv  于 2023-03-03  发布在  其他
关注(0)|答案(6)|浏览(436)

我在Visual Studio 2010中创建了一个新项目,并注意到项目目录中现在有两个名为objbin的新文件夹。
在生成和调试时会创建一对类似的文件夹-这些文件夹是做什么用的?

ws51t4hk

ws51t4hk1#

obj文件夹包含目标文件或中间文件,它们是尚未链接的已编译二进制文件。它们本质上是将被组合以生成最终可执行文件的片段。编译器为每个源文件生成一个目标文件,这些文件被放入obj文件夹。
bin文件夹包含二进制文件,它们是应用程序或库的实际可执行代码。
这些文件夹中的每一个都进一步细分为DebugRelease文件夹,它们只对应于项目的构建配置。上面讨论的两种类型的文件都放置在适当的文件夹中,这取决于您执行的构建类型。这使您可以轻松地确定哪些可执行文件是使用调试符号构建的。并且它们被构建为启用优化并且准备好发布。
请注意,可以在项目的“属性”中更改Visual Studio在编译期间输出可执行文件的位置。还可以更改生成配置的名称和选定选项。

icnyk63a

icnyk63a2#

我鼓励你看这个youtube视频,它演示了C# bin and obj folders之间的区别,也解释了我们如何获得增量/条件编译的好处。
C#编译是一个两步的过程,请参见下图了解更多详细信息:
1.编译:在编译阶段,单个的C#代码文件被编译成单个的编译单元。这些单个的编译代码文件存放在OBJ目录下。
1.链接:在链接阶段,这些单独编译的代码文件被链接以创建单个单元DLL和EXE。这将放在BIN目录中。

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

gt0wga4j

gt0wga4j3#

obj目录用于存放编译器或生成系统在生成期间生成的中间对象文件和其他临时数据文件。bin目录是最终输出二进制文件(以及任何依赖项或其他可部署文件)将写入的目录。
如果愿意,可以在项目设置中更改用于这两种目的的实际目录。

dnph8jn4

dnph8jn44#

关于obj目录有一个有趣的事实:如果您在Web项目中设置了发布,则要发布的文件将暂存到obj\Release\Package\PackageTmp。如果您希望自己发布文件而不是使用集成的VS功能,则可以获取实际需要部署在此处的文件,而不是在bin目录中的所有数字碎片中挑选。

vm0i2vca

vm0i2vca5#

如果您正在使用setup项目,请务必小心;Visual Studio安装项目Primary Outputobj文件夹而不是bin中提取。
我在msi安装程序中发布了我认为是模糊处理和签名的应用程序,有一段时间后,我才发现部署的应用程序文件实际上既没有模糊处理也没有签名,因为我在bin文件夹程序集上执行构建后过程,而应该针对obj文件夹程序集。
这离直观的imho很远,但是setup的一般方法是使用项目的Primary Output,这是obj文件夹。顺便说一句,如果有人能解释一下,我会很高兴的。

ekqde3dh

ekqde3dh6#

最好还是从更高的层面去理解这个问题:compilelink,它不仅适用于c#,而且适用于许多其他语言。
Compiling-修改后的源代码被编译为二进制目标代码。此代码尚不可执行。
Linking-目标代码与所需的支持代码组合在一起,以生成可执行程序。这一步通常包括添加所需的任何库。
具体来说,对于.net的情况,obj(对象)文件夹包含compiling stage的输出,而bin(二进制)文件夹包含链接器的输出。

相关问题