private void HandleExceptions(List <Task> tasks) { List <Exception> exceptions = new List <Exception>(); for (int i = 0; i < tasks.Count; i++) { Task task = tasks[i]; IPluginConfigurationItem plugin = _pluginConfiguration.Plugins.ElementAt(i); if (task.IsFaulted) { var summary = $"An exception was thrown when starting the plugin {plugin.Description}."; _logger.Write(summary, task.Exception); exceptions.AddRange(task.Exception.InnerExceptions); } else if (task.IsCompleted) { _logger.Write($"{plugin.Description} started successfully."); } } if (exceptions.Count > 0) { throw new AggregateException("One or more plugins failed to start. See inner exceptions for more details.", exceptions); } }
private void LogPluginInformation(IPluginConfigurationItem pluginConfiguration) { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("====================================="); stringBuilder.AppendLine($"Description: {pluginConfiguration.Description}"); stringBuilder.AppendLine($"Assembly: {pluginConfiguration.Assembly}"); stringBuilder.AppendLine($"Type: {pluginConfiguration.Type}"); stringBuilder.AppendLine($"Base Directory: {pluginConfiguration.BaseDirectory}"); stringBuilder.AppendLine($"Configuration File: {pluginConfiguration.ConfigurationFile}"); stringBuilder.AppendLine("====================================="); stringBuilder.AppendLine(); _logger.Write(stringBuilder.ToString()); }
private PluginContext LoadPlugin(IPluginConfigurationItem pluginConfiguration) { try { string baseDirectory = pluginConfiguration.BaseDirectory; if (string.IsNullOrEmpty(Path.GetPathRoot(baseDirectory)) || Path.GetPathRoot(baseDirectory) == @"\") { // Relative path. Append current directory. baseDirectory = Path.Combine(_currentDirectory, baseDirectory); } if (!Directory.Exists(baseDirectory)) { throw new DirectoryNotFoundException(baseDirectory); } var appDomainSetup = new AppDomainSetup { ApplicationBase = baseDirectory, ApplicationName = pluginConfiguration.Description, ConfigurationFile = pluginConfiguration.ConfigurationFile }; var appDomain = AppDomain.CreateDomain(pluginConfiguration.Description, new Evidence(), appDomainSetup); PluginService service = (PluginService)appDomain.CreateInstanceAndUnwrap(pluginConfiguration.Assembly, pluginConfiguration.Type); return(new PluginContext(appDomain, service)); } catch (Exception e) { var summary = $"Failed to load the plugin {pluginConfiguration.Description}."; _logger.Write(summary, e); throw; } }
public void AddConfigurationItem(IPluginConfigurationItem pluginConfigurationItem) { _pluginConfigurationItems.Add(pluginConfigurationItem); }