ChatGPT解决这个技术问题 Extra ChatGPT

What are the obj and bin folders (created by Visual Studio) used for?

I created a new project in Visual Studio 2010 and noticed that there are now two new folders named obj and bin in my project directory.

A similar pair of folders are created when building and debugging - what are these folders for?


C
Cody Gray

The obj folder holds object, or intermediate, files, which are compiled binary files that haven't been linked yet. They're essentially fragments that will be combined to produce the final executable. The compiler generates one object file for each source file, and those files are placed into the obj folder.

The bin folder holds binary files, which are the actual executable code for your application or library.

Each of these folders are further subdivided into Debug and Release folders, which simply correspond to the project's build configurations. The two types of files discussed above are placed into the appropriate folder, depending on which type of build you perform. This makes it easy for you to determine which executables are built with debugging symbols, and which were built with optimizations enabled and ready for release.

Note that you can change where Visual Studio outputs your executable files during a compile in your project's Properties. You can also change the names and selected options for your build configurations.


For whatever reason, my project doesn't have a debug or release sub-folder for the obj and bin folders. If I edit my project settings to build to the debug/release sub-folder depending on the currently selected configuration, i get an error that the data type couldn't be created when I debug my application. My app only ever looks in the bin folder for the dlls and never knows to look in the debug or release folder. How do I correct this?
@Sly I don't understand what you're asking. A project builds either an application (EXE) or a library (DLL). It cannot build both. So if your project creates an application, it will not place any DLLs into your bin folder. And if your project builds a library, you'll get an error when you try to debug it because you cannot execute a DLL. Anyway, it sounds like you've changed the default output path in your project's properties. If you need more help, ask a new question. Be sure to document the problem well, including screenshots of your project configuration if necessary.
I wonder if I can force visual studio delete obj folder after build is compelted?
@SlyRaskal One reason why you might not have Debug/Release folders is if you're developing a web project?
Does obj really only contain unlinked object code files? From my experience, it contains all of them, and at the final build step, the files that are part of the "final set" are copied into bin.
M
Meraj al Maksud

I would encourage you to see this youtube video which demonstrates the difference between C# bin and obj folders and also explains how we get the benefit of incremental/conditional compilation.

C# compilation is a two-step process, see the below diagram for more details:

Compiling: In compiling phase individual C# code files are compiled into individual compiled units. These individual compiled code files go in the OBJ directory. Linking: In the linking phase these individual compiled code files are linked to create single unit DLL and EXE. This goes in the BIN directory.

https://i.stack.imgur.com/665Gd.png

If you compare both bin and obj directory you will find greater number of files in the "obj" directory as it has individual compiled code files while "bin" has a single unit.

https://i.stack.imgur.com/8IbK7.png


I tried to compile both a C# console application and a WPF application with VS 2017 and .net 4.7. In both cases I couldn't find "individual compiled units", that is objects that have a 1-1 relationship with source files. Only xaml files seem to produce intermediate files for each source files. Maybe things are changed in newer version of .net? Maybe I'm missing something? Maybe this is how c++ works and nobody acutally checks those files out and see that it doesn't work that way?
D
David Ferenczy Rogožan

The obj directory is for intermediate object files and other transient data files that are generated by the compiler or build system during a build. The bin directory is the directory that final output binaries (and any dependencies or other deployable files) will be written to.

You can change the actual directories used for both purposes within the project settings, if you like.


"bin" can be changed in project properties -> "Build" -> "Output" -> "Output path". But what about "obj"?
R
Roger Hill

One interesting fact about the obj directory: If you have publishing set up in a web project, the files that will be published are staged to obj\Release\Package\PackageTmp. If you want to publish the files yourself rather than use the integrated VS feature, you can grab the files that you actually need to deploy here, rather than pick through all the digital debris in the bin directory.


S
SteveCinq

Be careful with setup projects if you're using them; Visual Studio setup projects Primary Output pulls from the obj folder rather than the bin.

I was releasing applications I thought were obfuscated and signed in msi setups for quite a while before I discovered that the deployed application files were actually neither obfuscated nor signed as I was performing the post-build procedure on the bin folder assemblies and should have been targeting the obj folder assemblies instead.

This is far from intuitive imho, but the general setup approach is to use the Primary Output of the project and this is the obj folder. I'd love it if someone could shed some light on this btw.