public static AssemblyLoaderImpl Create(InteractiveAssemblyLoader loader) { if (CoreClrShim.AssemblyLoadContext.Type != null) { return CreateCoreImpl(loader); } else { return new DesktopAssemblyLoaderImpl(loader); } }
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); }
internal CoreAssemblyLoaderImpl(InteractiveAssemblyLoader loader) : base(loader) { _inMemoryAssemblyContext = new LoadContext(Loader, null); }
public DesktopAssemblyLoaderImpl(InteractiveAssemblyLoader loader) : base(loader) { _assemblyResolveHandlerOpt = loader.ResolveAssembly; CorLightup.Desktop.AddAssemblyResolveHandler(_assemblyResolveHandlerOpt); }
public async Task MissingRefrencesAutoResolution() { var portableLib = CSharpCompilation.Create( "PortableLib", new[] { SyntaxFactory.ParseSyntaxTree("public class C {}") }, new[] { SystemRuntimePP7Ref }, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); var portableLibRef = portableLib.ToMetadataReference(); var loader = new InteractiveAssemblyLoader(); loader.RegisterDependency(Assembly.Load(portableLib.EmitToArray().ToArray())); var s0 = await CSharpScript.Create("new C()", options: ScriptOptions.Default.AddReferences(portableLibRef), assemblyLoader: loader).RunAsync(); var c0 = s0.Script.GetCompilation(); // includes corlib, host type assembly by default: AssertEx.Equal(new[] { typeof(object).GetTypeInfo().Assembly.Location, "PortableLib" }, c0.ExternalReferences.SelectAsArray(m => m.Display)); // System.Runtime, 4.0.0.0 depends on all the assemblies below: AssertEx.Equal(new[] { "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "PortableLib, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.ComponentModel.Composition, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", }, c0.GetBoundReferenceManager().GetReferencedAssemblies().Select(a => a.Value.Identity.GetDisplayName())); }
public DesktopAssemblyLoaderImpl(InteractiveAssemblyLoader loader) : base(loader) { _assemblyResolveHandlerOpt = loader.ResolveAssembly; CoreLightup.Desktop.AddAssemblyResolveHandler(_assemblyResolveHandlerOpt); }
private static AssemblyLoaderImpl CreateCoreImpl(InteractiveAssemblyLoader loader) { return new CoreAssemblyLoaderImpl(loader); }
protected AssemblyLoaderImpl(InteractiveAssemblyLoader loader) { Loader = loader; }
public abstract Script <T> CreateScript <T>( string code, ScriptOptions options, Type globalsTypeOpt, InteractiveAssemblyLoader assemblyLoader );
private static AssemblyLoaderImpl CreateCoreImpl(InteractiveAssemblyLoader loader) { return(new CoreAssemblyLoaderImpl(loader)); }