It is necessary to discuss here about private and shared
assemblies because of the difference in naming convention of assemblies in case
of private and shared assemblies.
Private Assemblies
An application-private assembly is an assembly that is only
visible to one application. The naming requirements for private assemblies are
simple: The assembly names must only be unique within the application. There is
no need for a globally unique name. Keeping the names unique is not a problem
because the application developer has complete control over which assemblies
are isolated to the application.
This version information is not enforced for private
assemblies because the developer has complete control over the assemblies that
are deployed to the application directory.
Shared Assemblies
The .NET Framework also supports the concept of a shared
assembly. A shared assembly is one that is used by multiple applications on the
machine.
Shared assemblies can be placed in the Global Assembly Cache
where CLR first searches for the assemblies. The global assembly cache is a
machine-wide store for assemblies that are used by more than one application. Since
it is shared by many other applications, developers do not have full control
over it and special care is needed in case of shared assemblies.
For example, a shared assembly must have a name that is
globally unique. Also, the system must provide for "protection of the
name"—that is, preventing someone from reusing another's assembly name.
The .NET Framework allows applications and administrators to
override the version of an assembly that is used by the application by
specifying version policies.