Пример #1
0
        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!");
        }