At the point that the CLR first needs to access the metadata for a type (e.g., when JIT-ing methods that use the type), it must first locate and load the assembly containing the type. The process of determining exactly which assembly to load is called “resolving,” and is performed by the assembly resolver. Once the assembly resolver has determined which physical file to load, the assembly loader is responsible for loading it into memory.
The assembly resolver performs a relatively complex set of operations, controlled by application and machine-level configuration files. These configuration files can tell the resolver to bind to a different version of the assembly than specified in the assembly reference, and can give the resolver hints about where to look for the physical file the loader should load (either at a URI endpoint, or in subdirectories under the application directory).
Once the resolver has identified which file to load and has verified that the name, version, culture and originator information in the assembly manifest in the located file matches what the resolver is expecting, it hands off to the loader, which physically loads and verifies the file.