internal LoadContext(InteractiveAssemblyLoader loader, string loadDirectoryOpt) { Debug.Assert(loader != null); _loader = loader; _loadDirectoryOpt = loadDirectoryOpt; // CoreCLR resolves assemblies in steps: // // 1) Call AssemblyLoadContext.Load -- our context returns null // 2) TPA list // 3) Default.Resolving event // 4) AssemblyLoadContext.Resolving event -- hooked below // // What we want is to let the default context load assemblies it knows about (this includes already loaded assemblies, // assemblies in AppPath, platform assemblies, assemblies explciitly resolved by the App by hooking Default.Resolving, etc.). // Only if the assembly can't be resolved that way, the interactive resolver steps in. // // This order is necessary to avoid loading assemblies twice (by the host App and by interactive loader). Resolving += (_, assemblyName) => _loader.ResolveAssembly( AssemblyIdentity.FromAssemblyReference(assemblyName), _loadDirectoryOpt ); }
protected override Assembly Load(AssemblyName assemblyName) { return(_loader.Loader.ResolveAssembly(AssemblyIdentity.FromAssemblyReference(assemblyName), _loadDirectoryOpt) ?? Default.LoadFromAssemblyName(assemblyName)); }