Assembly loading (Assembly.Load) is the process of loading an assembly reference. It starts with an assembly reference, and ends with a System.Reflection.Assembly instance that can be JITted and executed.
The following content is implementation detail. It is only applicable to CLR v2.0. And it may change in the future without notice.
The whole loading process can roughly be divided in several phases:
After phase 4, managed code in the assembly can be executed.
As we can see, no managed code can be executed before AppDomain.AssemblyLoad event is delivered. But unmanaged code may run during LoadLibrary if the assembly is MC++ assembly.