At this point, you hopefully have a much better idea about how a .NET assembly is hosted by the CLR. To summarize the key points:
A .NET process hosts one to many application domains. Each AppDomain is able to host any number of related .NET assemblies. AppDomains may be independently loaded and unloaded by the CLR (or programmatically via the System.AppDomain type).
A given AppDomain consists of one to many contexts. Using a context, the CLR is able to place a "special needs" object into a logical container, to ensure that its runtime requirements are honored.
If the previous pages have seemed to be a bit too low level for your liking, fear not. For the most part, the .NET runtime automatically ...