Maurice de Beijer provides a great summary of how assemblies are loaded by the .NET runtime. Towards the end he makes the point that “only the GAC allows for side by side installation of multiple versions”. This is not 100% true – the .NET runtime is capable of loading multiple versions of assemblies regardless of where they come from. In fact this is one of the strategies that Intilecta uses to dynamically render page content. While the application is running new content can be downloaded across the wire and dynamically loaded. Where content changes all we have to do is version the appropriate assembly and the application can load the new content without having to shut down.
The other point to make is that you don’t even need to persist assemblies to disk as the .NET runtime is capable of dynamically loading assemblies from a byte array or a stream. This is particularly useful where assemblies are being streamed across the wire.