Chapter 1:The .NET Foundation 11   to the original file. It uses the JIT compiler once again to compile the  IL code down to machine code. The JIT compiler, as it compiles to machine code, makes sure that the co de is type safe. It does this to ensure that objects are separate, thereby making certain that ob jects won t unintentionally corrupt one another. Assemblies In the applications that you build within the .NET Framework, assemblies  will always play an important role. Assemblies can be thought of as the building blocks of y our applications. Without an associated assembly, code will not be able to compile from IL . When you are using the JIT compiler to compile your code from managed code to machine code,  the JIT compiler will look for the IL code that is stored in a portable executable (PE)  file along with the associated assembly manifest. Every time you build a Web Form or Windows Form application in .NET, you  are actually building an assembly. Every one of these applications will contain at le ast one assembly. As in the Windows DNA world where DLLs and EXEs are the building blocks  of applications, in the .NET world, it is the assembly that is the used as the foundation  of applications. In the world of Windows DNA and COM, there was a situation that was refe rred to as DLL Hell. COM components were generally designed so that there was only one  version of that COM component on a machine at any given time. This was because the COM s pecification did not provide for the inclusion of dependency information in a compone nt’s type definition. When the developer had to make some changes to the COM component, this n ew component was introduced and, in many cases, broke applications. With .NET, it is now possible to have multiple versions of components, o r assemblies, running on the same server side by side. An application will always look for the  assembly that built it. When an application is started in .NET, the application will look for an  assembly in the installation folder. Assemblies that are stored in a local installation  folder are referred to as private assemblies. If the application cannot find the assembly within the installation fo lder, the application will turn to the Global Assembly Cache (GAC) for the assembly. The GAC is a place where you can store assemblies that you want to share  across applications. You can find the assemblies that are stored in the GAC in the WINNT\ASSEMBLY folder in your local disk drive. The structure of an assembly Assemblies contain code that is executed by the Common Language Runtime.  The great thing about assemblies is that they are self-describing. All the details about  the assembly are stored within the assembly itself. In the Windows DNA world, COM stored all its  self-describing data within the server s registry, and so installing (as well as uni nstalling) COM components meant shutting down IIS. Because .a NET assembly stores this information  within itself, it makes XCOPY functionality possible. Installing an assembly is as simple  as copying it, and there is no need to stop or start IIS while this is going on.