public void CollectAll() { DirectoryInfo directory = null; var currentAssLocation = new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName; if (Directory.Exists(Path.Combine(currentAssLocation, _pluginConfiguration.Directory))) { _logger.LogInformation("Relative plugin directory found."); directory = new DirectoryInfo(Path.Combine(currentAssLocation, _pluginConfiguration.Directory)); } else if (Directory.Exists(_pluginConfiguration.Directory)) { _logger.LogInformation("Absolute plugin directory found."); directory = new DirectoryInfo(_pluginConfiguration.Directory); } else { _logger.LogWarning("Plugin directory not found. Failed to load any plugins!"); Directory.CreateDirectory(Path.Combine(currentAssLocation, _pluginConfiguration.Directory)); return; } _logger.LogInformation("Searching for plugins..."); foreach (var plugin in directory.GetDirectories().Where(x => x.GetFiles().Any(c => c.Name == "plugin.json"))) { _logger.LogInformation("Found plugin folder {0}. Loading Assembly File...", plugin.FullName.Replace(currentAssLocation, "")); var jsonString = JsonConvert.DeserializeObject <PluginConfig>(File.ReadAllText(Path.Combine(plugin.FullName, "plugin.json"))); var pluginAssembly = Assembly.LoadFrom(Path.Combine(plugin.FullName, jsonString.Assembly)); var types = pluginAssembly.GetTypes().Where(x => x.IsSubclassOf(typeof(PluginBase)) && x.IsClass && !x.IsAbstract).ToList(); foreach (var type in types) { var instance = new PluginInstance(pluginAssembly, type); _logger.LogInformation(" Activating Plugin: {0}", type.Name); instance.Activate(); PluginInstances.Add(instance); _logger.LogInformation(" Activated Plugin: {0} ({1})", instance.Instance.Name, instance.Instance.Version); } } _logger.LogInformation("All compatable plugins loaded!"); _logger.LogInformation("Building plugin providers..."); foreach (var plugin in PluginInstances) { _logger.LogInformation(" Building Plugin Providers for {0}...", plugin.Instance.Name); var providers = plugin.Build(_configuration); foreach (var provider in providers) { var providerInstance = plugin.ActivateProvider(provider); _logger.LogInformation(" Activated provider {0}...", providerInstance.Name); } } _logger.LogInformation("All compatable providers built!"); }