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?
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.
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
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.
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.
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.
Success story sharing
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 intobin
.