A shared assembly is an assembly that can be referenced by more than one application. In order to share an assembly, the assembly must be explicitly built for this purpose. To understand what this means, let's take a look at the problem of shared components.
An assembly with just a simple text name (e.g., MyApp) cannot be guaranteed to be unique – there is nothing in the tools or in the runtime to prevent name collisions. There is also nothing to prevent such an assembly from being modified in unintended or uncontrolled ways. This approach to assembly identity works fine for private assemblies (intended for use only by the application they are deployed with) but for code that is intended to be shared by multiple applications a stronger notion of identity is required.
This stronger notion of identity is addressed by giving the assembly what is known as a ‘strong’ or ‘shared’ name, using standard public-key cryptography. A shared name is a simple text name accompanied by a public key and a digital signature that was generated over the assembly file (the file that contains the assembly manifest, which in turn contains the names and hashes of all of the files that make up the assembly) using the corresponding private key.
Shared assemblies can be deployed in either the global assembly cache or the application directory. For more information on the global assembly cache, see xxxxxxx. For more information on shared names, see What is a shared name?.