Beispiel #1
0
        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)
                {
                }
            }
        }