public async Task LoadPlugins(string basePath, List <string> include, List <string> exclude, string[] args) { LoadStarting?.Invoke(this, null); var uniqueFiles = await GetAllPluginFiles(basePath); foreach (var file in uniqueFiles) { var dlls = await Task.Run(() => Directory.GetFiles(Path.GetDirectoryName(file), "*.dll", SearchOption.AllDirectories)); _dlls.AddRange(dlls); } var argsDict = new Dictionary <string, string>(); foreach (var arg in args) { var parts = arg.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 2) { argsDict[parts[0]] = string.Join("=", parts.Skip(1)); } } var currentLoaded = new List <IPlugin>(); foreach (var file in uniqueFiles) { var name = Path.GetFileName(file).Split('.')[2]; if (include.Any(i => name.ToLower().StartsWith(i.ToLower()) || i == "*") && (exclude == null || !exclude.Any(e => name.ToLower().StartsWith(e.ToLower()) || e == "*"))) { try { _logger.Info(this, $"Loading plugin: {Path.GetFileName(file)} - {file}"); var ass = LoadAssembly(file); var pluginType = GetTypesSafely(ass).FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t)); if (pluginType == null) { continue; } var inst = _kernel.Get(pluginType) as IPlugin; foreach (var prop in GetTypeInjectableProperties(pluginType)) { var attr = prop.GetCustomAttribute <PanaceaInjectAttribute>(); if (argsDict.ContainsKey(attr.Alias)) { prop.SetValue(inst, Convert.ChangeType(argsDict[attr.Alias], prop.PropertyType)); } } currentLoaded.Add(inst); _loadedPlugins.Add(name, inst); PluginLoaded?.Invoke(this, inst); } catch { if (Debugger.IsAttached) { Debugger.Break(); } } } } foreach (var inst in currentLoaded) { try { await inst.BeginInit(); } catch (Exception ex) { _logger.Error(this, ex.Message); if (Debugger.IsAttached) { Debugger.Break(); } } } foreach (var inst in currentLoaded) { try { await inst.EndInit(); } catch { if (Debugger.IsAttached) { Debugger.Break(); } } } LoadFinished?.Invoke(this, null); }
protected virtual void RaiseLoadStarting(XslFOViewerEventArgs eventArgs) { LoadStarting.Raise(this, eventArgs); }