Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 protected virtual void UnloadPluginsCore()
 {
     plugins   = null;
     catalog   = null;
     container = null;
 }