internal static Collection <T> GetExportedPlugins <T>(IEnumerable <string> directories) { Collection <T> plugins = new Collection <T>(); MultiDirectoryCatalog catalog = null; CompositionContainer container = null; try { catalog = new MultiDirectoryCatalog(directories, searchPattern); container = new CompositionContainer(catalog); FillExportedPlugins <T>(container, plugins); } catch (Exception e) { GisEditor.LoggerManager.Log(LoggerLevel.Debug, e.Message, new ExceptionInfo(e)); } finally { if (catalog != null) { catalog.Dispose(); } if (container != null) { container.Dispose(); } } return(plugins); }
protected virtual Collection <Plugin> CollectPlugins <T>() where T : Plugin { Collection <Plugin> plugins = new Collection <Plugin>(); if (catalog == null || container == null) { List <string> tempPluginDirectories = new List <string>(); tempPluginDirectories.AddRange(pluginDirectories.Concat(GisEditor.InfrastructureManager.PluginDirectories).Distinct()); catalog = new MultiDirectoryCatalog(tempPluginDirectories, "*.dll"); container = new CompositionContainer(catalog); #if GISEditorUnitTest if (pluginDirectories.Count > 0 && !Directory.Exists(pluginDirectories[0])) { var file = Path.Combine(Path.GetDirectoryName(pluginDirectories[0]), "GisEditorPluginCore.dll"); if (File.Exists(file)) { container = new CompositionContainer(new AssemblyCatalog(Assembly.LoadFrom(file))); } } #endif } Collection <T> tmpPlugins = new Collection <T>(); PluginHelper.FillExportedPlugins <T>(container, tmpPlugins); tmpPlugins.ForEach(p => { if (p.IsRequired && !p.IsActive) { p.IsActive = true; } plugins.Add(p); }); #region Layer Plugin Key Attribute Authorizing. var allLayerTypeGroup = plugins.OfType <LayerPlugin>().GroupBy(g => g.GetLayerType()); foreach (var group in allLayerTypeGroup) { int count = group.Count(); if (count > 1) { var attributes = group.Key.GetCustomAttributes(typeof(LayerPluginKeyAttribute), false).OfType <LayerPluginKeyAttribute>(); if (attributes.Count() > 0) { List <string> keys = attributes.Select(a => a.Key).ToList(); string layerName = group.Key.FullName; Collection <string> layerPluginNames = new Collection <string>(); foreach (var item in group) { string pluginName = item.GetType().FullName; layerPluginNames.Add(pluginName); } Collection <Plugin> willRemovingPlugins = new Collection <Plugin>(); foreach (var item in layerPluginNames) { string key = LayerPluginKeyHelper.Sha1Encrypt(item, layerName); if (!keys.Contains(key)) { var plugin = plugins.First(p => p.GetType().FullName == item); willRemovingPlugins.Add(plugin); } } if (willRemovingPlugins.Count < layerPluginNames.Count) { foreach (var item in willRemovingPlugins) { plugins.Remove(item); } } } } } #endregion return(plugins); }
protected virtual void UnloadPluginsCore() { plugins = null; catalog = null; container = null; }