1. Location and visibility: A private assembly is normally used by a single application, and is stored in the application"s directory, or a sub-directory beneath. A shared assembly is normally stored in the global assembly cache, which is a repository of assemblies maintained by the .NET runtime. Shared assemblies are usually libraries of code which many applications will find useful, e.g. the .NET framework classes.
2. Versioning: The runtime enforces versioning constraints only on shared assemblies, not on private assemblies.