public static IPlugins GetPlugins(ITranslator translator, IAssemblyInfo config) { string path = null; if (!string.IsNullOrWhiteSpace(config.PluginsPath)) { path = Path.Combine(translator.FolderMode ? translator.Location : Path.GetDirectoryName(translator.Location), config.PluginsPath); } else { path = Path.Combine(translator.FolderMode ? translator.Location : Path.GetDirectoryName(translator.Location), "Bridge" + Path.DirectorySeparatorChar + "plugins"); } if (!System.IO.Directory.Exists(path)) { return new Plugins() { plugins = new IPlugin[0] }; } DirectoryCatalog dirCatalog = new DirectoryCatalog(path, "*.dll"); var catalog = new AggregateCatalog(dirCatalog); CompositionContainer container = new CompositionContainer(catalog); var plugins = new Plugins(); container.ComposeParts(plugins); return plugins; }
public static IPlugins GetPlugins(ITranslator translator, IAssemblyInfo config) { var path = GetPluginPath(translator, config); if (!System.IO.Directory.Exists(path)) { return new Plugins() { plugins = new IPlugin[0] }; } DirectoryCatalog dirCatalog = new DirectoryCatalog(path, "*.dll"); var catalog = new AggregateCatalog(dirCatalog); CompositionContainer container = new CompositionContainer(catalog); var plugins = new Plugins(); container.ComposeParts(plugins); return plugins; }
public static IPlugins GetPlugins(ITranslator translator, IAssemblyInfo config, ILogger logger) { logger.Info("Discovering plugins..."); if (!Plugins.IsLoaded) { var resolver = new AssemblyResolver() { Logger = logger }; AppDomain.CurrentDomain.AssemblyResolve += resolver.CurrentDomain_AssemblyResolve; AppDomain.CurrentDomain.AssemblyLoad += resolver.CurrentDomain_AssemblyLoad; Plugins.IsLoaded = true; logger.Trace("Set assembly Resolve and Load events for domain " + AppDomain.CurrentDomain.FriendlyName); } logger.Trace("Current domain " + AppDomain.CurrentDomain.FriendlyName); logger.Trace("Application base: " + AppDomain.CurrentDomain.SetupInformation.ApplicationBase); logger.Trace("Loaded assemblies:"); foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) { logger.Trace("\t" + a.FullName); } var path = GetPluginPath(translator, config); logger.Info("Will use the following plugin path \"" + path + "\""); var catalogs = new List <ComposablePartCatalog>(); if (Directory.Exists(path)) { catalogs.Add(new DirectoryCatalog(path, "*.dll")); logger.Info("The plugin path exists. Will use it as DirectoryCatalog"); } else { logger.Info("The plugin path does not exist. Skipping searching test framework plugins in the plugin folder."); } string[] skipPluginAssemblies = null; var translatorInstance = translator as Translator; if (translatorInstance != null) { skipPluginAssemblies = translatorInstance.SkipPluginAssemblies; } logger.Trace("Will search all translator references to find resource(s) with names starting from \"" + PLUGIN_RESOURCE_NAME_PREFIX + "\" ..."); foreach (var reference in translator.References) { logger.Trace("Searching plugins in reference " + reference.FullName + " ..."); if (skipPluginAssemblies != null && skipPluginAssemblies.FirstOrDefault(x => reference.Name.FullName.Contains(x)) != null) { logger.Trace("Skipping the reference " + reference.Name.FullName + " as it is in skipPluginAssemblies"); continue; } else { logger.Trace("skipPluginAssemblies is not set"); } var assemblies = reference.MainModule.Resources.Where(res => res.Name.StartsWith(PLUGIN_RESOURCE_NAME_PREFIX)); logger.Trace("The reference contains " + assemblies.Count() + " resource(s) needed"); if (assemblies.Any()) { foreach (var res_assembly in assemblies) { logger.Trace("Searching plugins in resource " + res_assembly.Name + " ..."); try { using (var resourcesStream = ((EmbeddedResource)res_assembly).GetResourceStream()) { var ba = new byte[(int)resourcesStream.Length]; resourcesStream.Read(ba, 0, (int)resourcesStream.Length); logger.Trace("Read the assembly resource stream of " + resourcesStream.Length + " bytes length"); var trimmedName = Plugins.TrimResourceAssemblyName(res_assembly, PLUGIN_RESOURCE_NAME_PREFIX); var assembly = CheckIfAssemblyLoaded(logger, ba, null, trimmedName); catalogs.Add(new AssemblyCatalog(assembly)); logger.Trace("The assembly " + assembly.FullName + " added to the catalogs"); } } catch (ReflectionTypeLoadException ex) { LogAssemblyLoaderException("Could not load assembly from resources", ex, logger); } catch (System.Exception ex) { logger.Error("Could not load assembly from resources: " + ex.ToString()); } } } } if (catalogs.Count == 0) { logger.Info("No AssemblyCatalogs found"); return(new Plugins() { plugins = new IPlugin[0] }); } var catalog = new AggregateCatalog(catalogs); CompositionContainer container = new CompositionContainer(catalog); var plugins = new Plugins(); logger.Info("ComposingParts to discover plugins..."); try { container.ComposeParts(plugins); } catch (ReflectionTypeLoadException ex) { LogAssemblyLoaderException("Could not compose Plugin parts", ex, logger); } catch (System.Exception ex) { logger.Error("Could not compose Plugin parts: " + ex.ToString()); } if (plugins.Parts != null) { foreach (var plugin in plugins.Parts) { plugin.Logger = translator.Log; } logger.Info("Discovered " + plugins.Parts.Count() + " plugin(s)"); } return(plugins); }
public static IPlugins GetPlugins(ITranslator translator, IAssemblyInfo config, ILogger logger) { logger.Info("Discovering plugins..."); if (!Plugins.IsLoaded) { var resolver = new AssemblyResolver() { Logger = logger }; AppDomain.CurrentDomain.AssemblyResolve += resolver.CurrentDomain_AssemblyResolve; AppDomain.CurrentDomain.AssemblyLoad += resolver.CurrentDomain_AssemblyLoad; Plugins.IsLoaded = true; logger.Trace("Set assembly Resolve and Load events for domain " + AppDomain.CurrentDomain.FriendlyName); } logger.Trace("Current domain " + AppDomain.CurrentDomain.FriendlyName); logger.Trace("Application base: " + AppDomain.CurrentDomain.SetupInformation.ApplicationBase); logger.Trace("Loaded assemblies:"); foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) { logger.Trace("\t" + a.FullName); } var path = GetPluginPath(translator, config); logger.Info("Will use the following plugin path \"" + path + "\""); var catalogs = new List<ComposablePartCatalog>(); if (Directory.Exists(path)) { catalogs.Add(new DirectoryCatalog(path, "*.dll")); logger.Info("The plugin path exists. Will use it as DirectoryCatalog"); } else { logger.Info("The plugin path does not exist. Skipping searching test framework plugins in the plugin folder."); } string[] skipPluginAssemblies = null; var translatorInstance = translator as Translator; if (translatorInstance != null) { skipPluginAssemblies = translatorInstance.SkipPluginAssemblies; } logger.Trace("Will search all translator references to find resource(s) with names starting from \"" + PLUGIN_RESOURCE_NAME_PREFIX + "\" ..."); foreach (var reference in translator.References) { logger.Trace("Searching plugins in reference " + reference.FullName + " ..."); if (skipPluginAssemblies != null && skipPluginAssemblies.FirstOrDefault(x => reference.Name.FullName.Contains(x)) != null) { logger.Trace("Skipping the reference " + reference.Name.FullName + " as it is in skipPluginAssemblies"); continue; } else { logger.Trace("skipPluginAssemblies is not set"); } var assemblies = reference.MainModule.Resources.Where(res => res.Name.StartsWith(PLUGIN_RESOURCE_NAME_PREFIX)); logger.Trace("The reference contains " + assemblies.Count() + " resource(s) needed"); if (assemblies.Any()) { foreach (var res_assembly in assemblies) { logger.Trace("Searching plugins in resource " + res_assembly.Name + " ..."); try { using (var resourcesStream = ((EmbeddedResource)res_assembly).GetResourceStream()) { var ba = new byte[(int)resourcesStream.Length]; resourcesStream.Read(ba, 0, (int)resourcesStream.Length); logger.Trace("Read the assembly resource stream of " + resourcesStream.Length + " bytes length"); var trimmedName = Plugins.TrimResourceAssemblyName(res_assembly, PLUGIN_RESOURCE_NAME_PREFIX); var assembly = CheckIfAssemblyLoaded(logger, ba, null, trimmedName); catalogs.Add(new AssemblyCatalog(assembly)); logger.Trace("The assembly " + assembly.FullName + " added to the catalogs"); } } catch (Exception ex) { logger.Error("Exception occurred:"); logger.Error(ex.Message); } } } } if (catalogs.Count == 0) { logger.Info("No AssemblyCatalogs found"); return new Plugins() { plugins = new IPlugin[0] }; } var catalog = new AggregateCatalog(catalogs); CompositionContainer container = new CompositionContainer(catalog); var plugins = new Plugins(); logger.Info("ComposingParts to discover plugins..."); try { container.ComposeParts(plugins); } catch (Exception ex) { logger.Error("Exception occurred:"); logger.Error(ex.Message); } if (plugins.Parts != null) { foreach (var plugin in plugins.Parts) { plugin.Logger = translator.Log; } logger.Info("Discovered " + plugins.Parts.Count() + " plugin(s)"); } return plugins; }