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); }
public App() { Plugin = new EmptyPlugin(); PluginApp = new TaskbarIconHost.App(this, Plugin, "Test-Plugin"); }