private static void RegisterExtensionServices(IServiceCollection services, IExtension extension, IConfiguration extensionConfiguration) { var extensionServiceProviderPaths = extension.GetOptions <string[]>(ExtensionServiceProvidersSectionName); if (extensionServiceProviderPaths is null) { return; } foreach (var path in extensionServiceProviderPaths) { try { using var assemblyStream = extension.GetFile(path); if (assemblyStream is null) { Console.WriteLine($"ERROR: Could not find extension service provider assembly {path} in extension {extension.Name}"); continue; } // AssemblyLoadContext is not available in .NET Standard 2.0 // var assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(assemblyStream); var assemblyBytes = new byte[assemblyStream.Length]; assemblyStream.Read(assemblyBytes, 0, assemblyBytes.Length); var assembly = Assembly.Load(assemblyBytes); var serviceProviders = assembly.GetTypes() .Where(t => t.IsPublic && !t.IsAbstract && typeof(IExtensionServiceProvider).IsAssignableFrom(t)) .Select(t => Activator.CreateInstance(t)) .Cast <IExtensionServiceProvider>(); foreach (var sp in serviceProviders) { sp.AddServices(new ExtensionServiceConfiguration(services, extensionConfiguration)); } } catch (FileLoadException) { } catch (BadImageFormatException) { } } }