An assembly is the basic building block of .NET applications and contains compiled code, metadata, and resources. It has an assembly manifest that stores information about the assembly including its name, version, and referenced assemblies. There are two types of assemblies: private assemblies used by a single application and public/shared assemblies that can be used by multiple applications by installing in the global assembly cache (GAC). Metadata describes types and members in an assembly and is stored in binary format to enable sharing across platforms.