An assembly is the logical unit of deployment in .NET and encompasses two kinds of implementation units: applications (.exe) and components (.dll). Whereas applications represent fully executable C# programs, components represent core reusable objects that provide basic services to build up applications. Indeed, Microsoft prefers to call C# a component-oriented rather than an object-oriented programming language.
Each assembly is either private or public and contains a manifest (a set of metadata)that provides information about its implementation units, such as name, owner, version, security permissions, culture, processor, operating system, public key signature, and all other needed resources (such as bitmaps). Private assemblies are used only by the application that installed them, but public (shared) assemblies are stored in a repository maintained by the .NET Framework called the Global Assembly Cache (GAC).
Finally, because every assembly contains version information, the CLR is able to handle multiple versions of the same component on the same platform.