public static void Init() { plugins.Clear(); BasePluginLoader.ParsePluginsConfig(); plugins.AddRange(new PythonPluginLoader().LoadPlugin()); plugins.AddRange(new CSharpPluginLoader().LoadPlugin()); foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin)) { IPlugin plugin1 = plugin; PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1); if (pluginPair != null) { PluginMetadata metadata = pluginPair.Metadata; ThreadPool.QueueUserWorkItem(o => plugin1.Init(new PluginInitContext() { Plugins = plugins, CurrentPluginMetadata = metadata, ChangeQuery = s => App.Window.ChangeQuery(s), CloseApp = App.Window.CloseApp, HideApp = App.Window.HideApp, ShowApp = () => App.Window.ShowApp(), ShowMsg = (title, subTitle, iconPath) => App.Window.ShowMsg(title, subTitle, iconPath), OpenSettingDialog = () => App.Window.OpenSettingDialog(), ShowCurrentResultItemTooltip = (msg) => App.Window.ShowCurrentResultItemTooltip(msg) })); } } }
public static void Init() { if (initializing != null) { return; } initializing = new ManualResetEvent(false); plugins.Clear(); BasePluginLoader.ParsePluginsConfig(); if (UserSettingStorage.Instance.EnablePythonPlugins) { plugins.AddRange(new PythonPluginLoader().LoadPlugin()); } plugins.AddRange(new CSharpPluginLoader().LoadPlugin()); Forker forker = new Forker(); foreach (IPlugin plugin in plugins.Select(pluginPair => pluginPair.Plugin)) { IPlugin plugin1 = plugin; PluginPair pluginPair = plugins.FirstOrDefault(o => o.Plugin == plugin1); if (pluginPair != null) { PluginMetadata metadata = pluginPair.Metadata; pluginPair.InitContext = new PluginInitContext() { Plugins = plugins, CurrentPluginMetadata = metadata, ChangeQuery = s => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ChangeQuery(s))), CloseApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.CloseApp())), HideApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.HideApp())), ShowApp = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ShowApp())), ShowMsg = (title, subTitle, iconPath) => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ShowMsg(title, subTitle, iconPath))), OpenSettingDialog = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.OpenSettingDialog())), ShowCurrentResultItemTooltip = (msg) => App.Window.Dispatcher.Invoke(new Action(() => App.Window.ShowCurrentResultItemTooltip(msg))), ReloadPlugins = () => App.Window.Dispatcher.Invoke(new Action(() => Init())), InstallPlugin = (filePath) => App.Window.Dispatcher.Invoke(new Action(() => { PluginInstaller.Install(filePath); })), StartLoadingBar = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.StartLoadingBar())), StopLoadingBar = () => App.Window.Dispatcher.Invoke(new Action(() => App.Window.StopLoadingBar())), //ShellRun = (cmd) => (bool)App.Window.Dispatcher.Invoke(new Func<bool>(() => App.Window.ShellRun(cmd))) }; pluginPair.InitContext.ShellRun = (cmd) => { try { return((bool)App.Window.Dispatcher.Invoke(new Func <bool>(() => App.Window.ShellRun(cmd)))); } catch (Exception) { return(false); } }; forker.Fork(() => plugin1.Init(pluginPair.InitContext)); } } ThreadPool.QueueUserWorkItem(o => { forker.Join(); initializing.Set(); initializing = null; }); }