static MetadataReference RegisterAssembly(Assembly assembly) { var assemblyName = assembly.GetName(); if (AdditionalAssemblies.Value.TryGetValue(assemblyName.FullName, out var additionalAssembly)) { return(additionalAssembly.AssemblyMetadataReference); } if (AdditionalAssemblies.Value.TryGetValue(assemblyName.Name, out additionalAssembly)) { return(additionalAssembly.AssemblyMetadataReference); } additionalAssembly = new AdditionalAssemblyServerSide(assemblyName, assembly, CreateMetadataReferenceFromAssembly(assembly), AdditionalAssemblyType.Package); AdditionalAssemblies.Value.TryAdd(assemblyName.FullName, additionalAssembly); AdditionalAssemblies.Value.TryAdd(assemblyName.Name, additionalAssembly); return(additionalAssembly.AssemblyMetadataReference); }
private static ConcurrentDictionary <string, AdditionalAssemblyServerSide> DiscoverAdditionalAssemblies() { var results = new ConcurrentDictionary <string, AdditionalAssemblyServerSide>(StringComparer.OrdinalIgnoreCase); foreach (var path in Directory.GetFiles(AppContext.BaseDirectory, "*.dll")) { if (Logger.IsInfoEnabled) { Logger.Info($"Attempting to load additional assembly from '{path}'."); } try { var name = AssemblyLoadContext.GetAssemblyName(path); var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(path); var reference = CreateMetadataReferenceFromAssembly(assembly); var result = new AdditionalAssemblyServerSide(name, assembly, reference, AdditionalAssemblyType.BaseDirectory); results.TryAdd(name.FullName, result); results.TryAdd(name.Name, result); if (Logger.IsInfoEnabled) { Logger.Info($"Loaded additional assembly from '{path}' and registered it under '{name.Name}'."); } } catch (Exception e) { if (Logger.IsInfoEnabled) { Logger.Info($"Could not load additional assembly from '{path}'.", e); } } } return(results); }