/// <summary> /// Loads controllers and razor pages from a plugin assembly. /// <para> /// This creates a loader with <see cref="PluginConfig.PreferSharedTypes" /> set to <c>true</c>. /// If you need more control over shared types, use <see cref="AddPluginLoader" /> instead. /// </para> /// </summary> /// <param name="mvcBuilder">The MVC builder</param> /// <param name="assemblyFile">Full path the main .dll file for the plugin.</param> /// <returns>The builder</returns> public static IMvcBuilder AddPluginFromAssemblyFile(this IMvcBuilder mvcBuilder, string assemblyFile) { var plugin = PluginLoader.CreateFromAssemblyFile( assemblyFile, // create a plugin from for the .dll file config => // this ensures that the version of MVC is shared between this app and the plugin config.PreferSharedTypes = true); return(mvcBuilder.AddPluginLoader(plugin)); }
public static IMvcBuilder AddPlugins(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection, IConfiguration config, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger(typeof(PluginManager)); var pluginsFolder = config.GetPluginDir(DefaultConfiguration.GetNetworkType(config)); var plugins = new List <IBTCPayServerPlugin>(); _logger.LogInformation($"Loading plugins from {pluginsFolder}"); Directory.CreateDirectory(pluginsFolder); ExecuteCommands(pluginsFolder); List <(PluginLoader, Assembly, IFileProvider)> loadedPlugins = new List <(PluginLoader, Assembly, IFileProvider)>(); var systemExtensions = GetDefaultLoadedPluginAssemblies(); plugins.AddRange(systemExtensions.SelectMany(assembly => GetAllPluginTypesFromAssembly(assembly).Select(GetPluginInstanceFromType))); foreach (IBTCPayServerPlugin btcPayServerExtension in plugins) { btcPayServerExtension.SystemPlugin = true; } foreach (var dir in Directory.GetDirectories(pluginsFolder)) { var pluginName = Path.GetFileName(dir); var plugin = PluginLoader.CreateFromAssemblyFile( Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file config => // this ensures that the version of MVC is shared between this app and the plugin config.PreferSharedTypes = true); mvcBuilder.AddPluginLoader(plugin); var pluginAssembly = plugin.LoadDefaultAssembly(); _pluginAssemblies.Add(pluginAssembly); var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly); loadedPlugins.Add((plugin, pluginAssembly, fileProvider)); plugins.AddRange(GetAllPluginTypesFromAssembly(pluginAssembly) .Select(GetPluginInstanceFromType)); } foreach (var plugin in plugins) { try { _logger.LogInformation( $"Adding and executing plugin {plugin.Identifier} - {plugin.Version}"); plugin.Execute(serviceCollection); serviceCollection.AddSingleton(plugin); } catch (Exception e) { _logger.LogError($"Error when loading plugin {plugin.Identifier} - {plugin.Version}{Environment.NewLine}{e.Message}"); } } return(mvcBuilder); }
public static void AddExtensions(this IServiceCollection serviceCollection, string extensionsFolder, IMvcBuilder mvcBuilder) { var providers = new List <IFileProvider>(); var extensions = new List <BtcTransmuterExtension>(); var loadedPluginAssemblies = GetDefaultLoadedPluginAssemblies(); // providers.AddRange(loadedPluginAssemblies.Select(CreateEmbeddedFileProviderForAssembly)); extensions.AddRange(loadedPluginAssemblies.SelectMany(assembly => GetAllExtensionTypesFromAssembly(assembly).Select(GetExtensionInstanceFromType))); Console.WriteLine($"Loading extensions from {extensionsFolder}"); Directory.CreateDirectory(extensionsFolder); foreach (var dir in Directory.GetDirectories(extensionsFolder)) { var pluginName = Path.GetFileName(dir); var plugin = PluginLoader.CreateFromAssemblyFile( Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file config => // this ensures that the version of MVC is shared between this app and the plugin config.PreferSharedTypes = true); mvcBuilder.AddPluginLoader(plugin); var pluginAssembly = plugin.LoadDefaultAssembly(); // providers.Add(CreateEmbeddedFileProviderForAssembly(pluginAssembly)); extensions.AddRange(GetAllExtensionTypesFromAssembly(pluginAssembly) .Select(GetExtensionInstanceFromType)); } serviceCollection.Configure <MvcRazorRuntimeCompilationOptions>(options => { foreach (var embeddedFileProvider in providers) { options.FileProviders.Add(embeddedFileProvider); } }); foreach (var btcTransmuterExtension in extensions) { btcTransmuterExtension.Execute(serviceCollection); } }
public static IMvcBuilder AddExtensions(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection, IConfiguration config, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger(typeof(ExtensionManager)); var extensionsFolder = config.GetExtensionDir(DefaultConfiguration.GetNetworkType(config)); var extensions = new List <IBTCPayServerExtension>(); _logger.LogInformation($"Loading extensions from {extensionsFolder}"); Directory.CreateDirectory(extensionsFolder); ExecuteCommands(extensionsFolder); List <(PluginLoader, Assembly, IFileProvider)> plugins = new List <(PluginLoader, Assembly, IFileProvider)>(); foreach (var dir in Directory.GetDirectories(extensionsFolder)) { var pluginName = Path.GetFileName(dir); var plugin = PluginLoader.CreateFromAssemblyFile( Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file config => // this ensures that the version of MVC is shared between this app and the plugin config.PreferSharedTypes = true); mvcBuilder.AddPluginLoader(plugin); var pluginAssembly = plugin.LoadDefaultAssembly(); _pluginAssemblies.Add(pluginAssembly); var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly); plugins.Add((plugin, pluginAssembly, fileProvider)); extensions.AddRange(GetAllExtensionTypesFromAssembly(pluginAssembly) .Select(GetExtensionInstanceFromType)); } foreach (var extension in extensions) { _logger.LogInformation($"Adding and executing extension {extension.Identifier} - {extension.Version}"); serviceCollection.AddSingleton(extension); extension.Execute(serviceCollection); } return(mvcBuilder); }
public static IMvcBuilder AddPlugins(this IMvcBuilder mvcBuilder, IServiceCollection serviceCollection, IConfiguration config, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger(typeof(PluginManager)); var pluginsFolder = new DataDirectories().Configure(config).PluginDir; var plugins = new List <IBTCPayServerPlugin>(); serviceCollection.Configure <KestrelServerOptions>(options => { options.Limits.MaxRequestBodySize = int.MaxValue; // if don't set default value is: 30 MB }); _logger.LogInformation($"Loading plugins from {pluginsFolder}"); Directory.CreateDirectory(pluginsFolder); ExecuteCommands(pluginsFolder); List <(PluginLoader, Assembly, IFileProvider)> loadedPlugins = new List <(PluginLoader, Assembly, IFileProvider)>(); var systemExtensions = GetDefaultLoadedPluginAssemblies(); plugins.AddRange(systemExtensions.SelectMany(assembly => GetAllPluginTypesFromAssembly(assembly).Select(GetPluginInstanceFromType))); foreach (IBTCPayServerPlugin btcPayServerExtension in plugins) { btcPayServerExtension.SystemPlugin = true; } var orderFilePath = Path.Combine(pluginsFolder, "order"); var availableDirs = Directory.GetDirectories(pluginsFolder); var orderedDirs = new List <string>(); if (File.Exists(orderFilePath)) { var order = File.ReadLines(orderFilePath); foreach (var s in order) { if (availableDirs.Contains(s)) { orderedDirs.Add(s); } } orderedDirs.AddRange(availableDirs.Where(s => !orderedDirs.Contains(s))); } else { orderedDirs = availableDirs.ToList(); } var disabledPlugins = GetDisabledPlugins(pluginsFolder); foreach (var dir in orderedDirs) { var pluginName = Path.GetFileName(dir); if (disabledPlugins.Contains(pluginName)) { continue; } var plugin = PluginLoader.CreateFromAssemblyFile( Path.Combine(dir, pluginName + ".dll"), // create a plugin from for the .dll file config => { // this ensures that the version of MVC is shared between this app and the plugin config.PreferSharedTypes = true; config.IsUnloadable = true; }); mvcBuilder.AddPluginLoader(plugin); var pluginAssembly = plugin.LoadDefaultAssembly(); _pluginAssemblies.Add(pluginAssembly); _plugins.Add(plugin); var fileProvider = CreateEmbeddedFileProviderForAssembly(pluginAssembly); loadedPlugins.Add((plugin, pluginAssembly, fileProvider)); plugins.AddRange(GetAllPluginTypesFromAssembly(pluginAssembly) .Select(GetPluginInstanceFromType)); } foreach (var plugin in plugins) { try { _logger.LogInformation( $"Adding and executing plugin {plugin.Identifier} - {plugin.Version}"); plugin.Execute(serviceCollection); serviceCollection.AddSingleton(plugin); } catch (Exception e) { _logger.LogError( $"Error when loading plugin {plugin.Identifier} - {plugin.Version}{Environment.NewLine}{e.Message}"); } } return(mvcBuilder); }