Part of an assembly's identity is a simple, friendly textual name (like My401kApp). These names are given to the assembly by the developer when the assembly is authored. These names are referred to as simple names. Simple names are not guaranteed to be unique - there is nothing in the tools or in the runtime to prevent collisions.
Simple names for assemblies are easy and convenient to use and are sufficient in a number of cases. In particular, individual developers or small development shops have no need for a more sophisticated naming scheme and we shouldn't complicate their lives for no obvious benefit. However, there are a number of situations where developers must be able to guarantee that the names they choose for their assemblies will be globally unique. In COM, uniqueness was guaranteed by assigning a unique GUID to each component. We are not carrying this notion forward into the runtime because GUIDs have a number of deficiencies that we would like to correct. In particular, while GUIDs are unique when they are generated, nothing prevents another developer from later reusing your GUID and "substituting" her code for yours.
The runtime solves this problem of name uniqueness and name security using standard public-key cryptography. Names secured with a key-pair are termed shared names.
In particular, shared names satisfy the following requirements:
In addition, the runtime's security team also has the following requirements for shared names: