示例#1
0
        private static List <PluginAssembly> LoadSortedPlugins(IEnumerable <Assembly> assemblies)
        {
            if (null == assemblies)
            {
                throw new Exception("assemblies 不能为null!");
            }
            var list = assemblies.Select(assembly =>
            {
                var pluginType = assembly.GetTypes().FirstOrDefault(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);

                IPlugin pluginInstance = null;
                if (pluginType != null && pluginType != typeof(EmptyPlugin))
                {
                    pluginInstance = Activator.CreateInstance(pluginType) as IPlugin;
                    //throw new NotSupportedException("所有插件包中必须有且仅有一个实现 IPlugin 接口的类型!" + Environment.NewLine + "文件路径:" + file);
                }
                else
                {
                    pluginInstance = new EmptyPlugin(assembly);
                }

                return(new PluginAssembly(assembly, pluginInstance));
            })
                       .ToList();

            //将 list 中集合中的元素,先按照 SetupLevel 排序;
            //然后同一个启动级别中的插件,再按照引用关系来排序。
            var sorted = new List <PluginAssembly>(list.Count);
            var groups = list.GroupBy(a => a.Instance.SetupLevel).OrderBy(g => g.Key);
            var index  = 0;

            foreach (var group in groups)
            {
                var sortedItems = SortByReference(group);
                for (int i = 0, c = sortedItems.Count; i < c; i++)
                {
                    var item = sortedItems[i];
                    item.SetupIndex = index++;
                    sorted.Add(item);
                }
            }

            return(sorted);
        }
示例#2
0
 public App()
 {
     Plugin    = new EmptyPlugin();
     PluginApp = new TaskbarIconHost.App(this, Plugin, "Test-Plugin");
 }