/// <summary> /// Add a plugin to the collection. /// </summary> /// <param name="path">Full file path to plugin</param> /// <returns>Position of plugin in collection</returns> /// <history> /// [Curtis_Beard] 07/28/2006 Created /// </history> public static int Add(string path) { PluginWrapper plugin = LoadPlugin(path); if (plugin != null) { return(__PluginCollection.Add(plugin)); } return(-1); }
internal static void LockPlugins() { //所有插件(其中,DomainPlugins 在列表的前面,UIPlugins 在列表的后面。) _allPlugins = new PluginCollection(); //domain plugins. #if NET45 var configPlugins = Configuration.Section.DomainPlugins.OfType <PluginElement>().Select(e => e.Plugin).ToArray(); #endif #if NS2 var configPlugins = Configuration.Section.DomainPlugins; #endif if (configPlugins != null && configPlugins.Length > 0) { InitPluginsByConfig(_domainPlugins, configPlugins); } _domainPlugins.Insert(0, new Rafy.Domain.RafyDomainPlugin()); _domainPlugins.Lock(); foreach (var item in _domainPlugins) { _allPlugins.Add(item); } //ui plugins. if (_location.IsUI) { #if NET45 configPlugins = Configuration.Section.UIPlugins.OfType <PluginElement>().Select(e => e.Plugin).ToArray(); #endif #if NS2 configPlugins = Configuration.Section.UIPlugins; #endif if (configPlugins != null && configPlugins.Length > 0) { InitPluginsByConfig(_uiPlugins, configPlugins); } if (_location.IsWPFUI) { _uiPlugins.Insert(0, LoadRafyPlugin("Rafy.WPF")); } _uiPlugins.Lock(); foreach (var item in _uiPlugins) { _allPlugins.Add(item); } } CheckDuplucatePlugins(); _allPlugins.Lock(); }
public static PluginCollection LoadCollectors() { PluginCollection loadedPlugins = new PluginCollection(); string pluginFilter = "NodeCollector.*.dll"; string dllDirectory = AppDomain.CurrentDomain.BaseDirectory; GVars.MyLog.WriteEntry(string.Format("Loading available collectors from directory {0} (filter {1})", dllDirectory, pluginFilter)); // Search for all filtes matching the filter and try to load them string[] pluginFiles = Directory.GetFiles(dllDirectory, pluginFilter); foreach (string filename in pluginFiles) { try { NodeCollector.Core.INodeCollector plugin = PluginSystem.LoadAssembly(filename); loadedPlugins.Add(plugin); } catch (Exception ex) { GVars.MyLog.WriteEntry(string.Format("Unable to load collector plugin {0}: {1}.", filename, ex.Message.ToString()), EventLogEntryType.Error, 0); } } // Log a list of loaded plugins to eventlog List <string> pluginNames = loadedPlugins.Select(x => x.GetName()).ToList(); pluginNames.Sort(); GVars.MyLog.WriteEntry(string.Format("Loaded plugins: {0}", string.Join(", ", pluginNames))); return(loadedPlugins); }
/// <summary> /// Iterate through all the child nodes /// of the XMLNode that was passed in and create instances /// of the specified Types by reading the attribite values of the nodes /// we use a try/Catch here because some of the nodes /// might contain an invalid reference to a plugin type /// </summary> /// <param name="parent"></param> /// <param name="configContext"></param> /// <param name="section">The XML section we will iterate against</param> /// <returns></returns> public object Create(object parent, object configContext, System.Xml.XmlNode section) { PluginCollection plugins = new PluginCollection(); foreach (XmlNode node in section.ChildNodes) { try { //Use the Activator class's 'CreateInstance' method //to try and create an instance of the plugin by //passing in the type name specified in the attribute value object plugObject = Activator.CreateInstance(Type.GetType(node.Attributes["type"].Value)); //Cast this to an IPlugin interface and add to the collection IPlugin plugin = (IPlugin)plugObject; plugins.Add(plugin); } catch (Exception e) { //Catch any exceptions //but continue iterating for more plugins } } return(plugins); }
private static void InitPluginsByConfig(PluginCollection pluginList, string[] sortedPlugins) { if (sortedPlugins.Length == 0) { return; } //如果提供了配置信息,则完成按照配置中的插件列表来初始化,所以先清空该列表。 pluginList.Clear(); for (int i = 0, c = sortedPlugins.Length; i < c; i++) { var name = sortedPlugins[i]; IPlugin plugin = null; //可以只填写程序集名称,也可以写出插件类型的全名称。 if (!name.Contains(',')) { #region 照程序集名称来加载插件 Assembly assembly = null; try { assembly = Assembly.Load(sortedPlugins[i]); } catch (Exception ex) { throw new InvalidProgramException(string.Format("无法加载配置文件中指定的插件:{0}。", sortedPlugins[i]), ex); } plugin = CreatePluginFromAssembly(assembly); #endregion } else { #region 照插件类型名称来加载插件 Type pluginType = null; try { pluginType = Type.GetType(sortedPlugins[i]); } catch (Exception ex) { throw new InvalidProgramException(string.Format("无法加载配置文件中指定的插件类型:{0}。", sortedPlugins[i]), ex); } if (pluginType == null) { throw new InvalidProgramException(string.Format("无法加载配置文件中指定的插件类型:{0}。", sortedPlugins[i])); } plugin = Activator.CreateInstance(pluginType, true) as IPlugin; #endregion } pluginList.Add(plugin); } }
/// <summary> /// Loads the assembly and looks for a class of type IPlugin. /// </summary> /// <param name="plugin">Plugin to load.</param> /// <returns>True if the assembly loaded correctly and contains a valid Tilde plugin.</returns> /// <remarks>Throws an exception if loading the assembly failed.</remarks> private bool LoadPluginInternal(PluginDetails plugin) { Assembly assembly = Assembly.LoadFile(plugin.Path); foreach (PluginDetails details in mPlugins) { if (details.Assembly.FullName == assembly.FullName) { return(false); } } foreach (Type type in assembly.GetTypes()) { if (typeof(IPlugin).IsAssignableFrom(type) && type != typeof(IPlugin)) { plugin.Assembly = assembly; mAssemblies.Add(assembly); mPlugins.Add(plugin); return(true); } } return(false); }
static void Main(string[] args) { string testStrToLow = "StringToLower plugin test"; StringToLower strToLow = new StringToLower(); testStrToLow = strToLow.Modify(testStrToLow); Console.WriteLine(testStrToLow); Console.WriteLine(); string testStrToUp = "StringToUpper plugin test"; StringToUpper strToUp = new StringToUpper(); testStrToUp = strToUp.Modify(testStrToUp); Console.WriteLine(testStrToUp); Console.WriteLine(); PluginCollection <string> plCol = new PluginCollection <string>(); plCol.Add(strToLow); plCol.Add(strToUp); string testPlCol = "PluginCollection plugin Test"; testPlCol = plCol.Modify(testPlCol); Console.WriteLine(testPlCol); Console.WriteLine(); string testPlPrint = "PluginPrinter test"; PluginPrinter <string> plPrinter = new PluginPrinter <string>(strToLow, testPlPrint); plPrinter.Print(); Console.WriteLine(); Console.WriteLine("DoublePlugin plugin test"); double testDouble = -54.582; DoublePlugin doublePl = new DoublePlugin(); Console.WriteLine(doublePl.Modify(testDouble)); Console.WriteLine(); Console.WriteLine("PluginablePlugin plugin test"); PluginablePlugin plaginablePl = new PluginablePlugin(doublePl); Console.WriteLine(plaginablePl.Modify(testDouble)); Console.ReadLine(); }
public static PluginCollection SelectAll() { PluginCollection List = new PluginCollection(); using (IDataReader rd = SqlHelper.ExecuteReader(DAL.con(), CommandType.StoredProcedure, "sp_tblPlugin_Select_SelectAll_hoangda")) { while (rd.Read()) { List.Add(getFromReader(rd)); } } return(List); }
static void Main(string[] args) { string testStrToLow = "StringToLower plugin test"; StringToLower strToLow = new StringToLower(); testStrToLow = strToLow.Modify(testStrToLow); Console.WriteLine(testStrToLow); Console.WriteLine(); string testStrToUp = "StringToUpper plugin test"; StringToUpper strToUp = new StringToUpper(); testStrToUp = strToUp.Modify(testStrToUp); Console.WriteLine(testStrToUp); Console.WriteLine(); PluginCollection<string> plCol = new PluginCollection<string>(); plCol.Add(strToLow); plCol.Add(strToUp); string testPlCol = "PluginCollection plugin Test"; testPlCol = plCol.Modify(testPlCol); Console.WriteLine(testPlCol); Console.WriteLine(); string testPlPrint = "PluginPrinter test"; PluginPrinter<string> plPrinter = new PluginPrinter<string>(strToLow, testPlPrint); plPrinter.Print(); Console.WriteLine(); Console.WriteLine("DoublePlugin plugin test"); double testDouble = -54.582; DoublePlugin doublePl = new DoublePlugin(); Console.WriteLine(doublePl.Modify(testDouble)); Console.WriteLine(); Console.WriteLine("PluginablePlugin plugin test"); PluginablePlugin plaginablePl = new PluginablePlugin(doublePl); Console.WriteLine(plaginablePl.Modify(testDouble)); Console.ReadLine(); }
internal static void CreateStartupPlugins() { //所有插件(其中,DomainPlugins 在列表的前面,UIPlugins 在列表的后面。) //domain plugins. IPluginConfig[] configPlugins = GetDomainPluginsConfig(); CreateStartupPluginsByConfig(_domainPlugins, configPlugins); _domainPlugins.Insert(0, new Rafy.Domain.RafyDomainPlugin());//其实这里不应该使用上层的类,但是内部为了简单实现,且效率更高。 _domainPlugins.Lock(); foreach (var item in _domainPlugins) { _allPlugins.Add(item); } //ui plugins. if (_location.IsUI) { configPlugins = GetUIPluginsConfig(); CreateStartupPluginsByConfig(_uiPlugins, configPlugins); //if (_location.IsWPFUI) //{ // _uiPlugins.Insert(0, CreatePlugin("Rafy.WPF.RafyWPFPlugin, Rafy.WPF")); // //_uiPlugins.Insert(0, LoadRafyPlugin("Rafy.WPF")); //} _uiPlugins.Lock(); foreach (var item in _uiPlugins) { _allPlugins.Add(item); } } CheckDuplucatePlugins(); _allPlugins.Lock(); }
void InitBass() { // initialize default output device if (!Bass.Init()) { MessageBox.Show("Can't initialize device"); Application.Current.Shutdown(); } // initialize file selector _ofd.Filter = "BASS built-in (*.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif)|*.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif"; // look for plugins (in the executable's directory) foreach (var plugin in Directory.EnumerateFiles(Environment.CurrentDirectory, "bass*.dll")) { var fileName = Path.GetFileNameWithoutExtension(plugin); int hPlugin; if ((hPlugin = Bass.PluginLoad(plugin)) == 0) { continue; } // plugin loaded... var pinfo = Bass.PluginGetInfo(hPlugin); // get plugin info to add to the file selector filter... foreach (var format in pinfo.Formats) { _ofd.Filter += $"|{format.Name} ({format.FileExtensions}) - {fileName}|{format.FileExtensions}"; } // add plugin to the list PluginCollection.Add(fileName); } _ofd.Filter += "|All Files|*.*"; if (PluginCollection.Count == 0) // no plugins... { PluginCollection.Add("no plugins - visit the BASS webpage to get some"); } }
/// <summary> /// 在运行时,按需加载指定的插件 /// </summary> /// <param name="pluginClass">要加载的插件类</param> /// <param name="pluginType">该插件的类型</param> /// <param name="checkExistence">是否检查存在性?</param> private static void LoadRuntimePlugin(string pluginClass, PluginType pluginType, bool checkExistence) { var plugin = CreatePlugin(pluginClass); //已经加载过的插件,不再加载。 if (checkExistence && _allPlugins.Find(plugin.Assembly) != null) { return; } if (pluginType == PluginType.Domain) { _domainPlugins.Unlock(); _domainPlugins.Add(plugin); _domainPlugins.Lock(); } else { _uiPlugins.Unlock(); _uiPlugins.Add(plugin); _uiPlugins.Lock(); } _allPlugins.Unlock(); _allPlugins.Add(plugin); _allPlugins.Lock(); //实体类型对应的集合需要重建。 EntityConfigRepository.ClearCache(); var handler = RuntimePluginLoaded; if (handler != null) { handler(null, new PluginEventArgs { Plugin = plugin, PluginType = pluginType }); } //加载完成后,再初始化。 plugin.Initialize(_appCore); }
private static void CreateStartupPluginsByConfig(PluginCollection pluginList, IPluginConfig[] sortedPlugins) { if (sortedPlugins.Length == 0) { return; } for (int i = 0, c = sortedPlugins.Length; i < c; i++) { var pluginSection = sortedPlugins[i]; if (pluginSection.LoadType == PluginLoadType.AsRequired && EnablePluginLoadAsRequired) { continue; } IPlugin plugin = CreatePlugin(pluginSection.Plugin); pluginList.Add(plugin); } }
public static PluginCollection GetPlugins(string rootFolder, HttpSessionState session, AdminPanelSettings apSettings) { PluginCollection result = new PluginCollection(); try { foreach (Plugin pl in apSettings.Plugins) { if (Directory.Exists(Path.Combine(rootFolder, @"plugins\" + pl.FolderName))) { result.Add(pl); } } } catch (Exception error) { Log.WriteException(error); throw; } return(result); }
/// <summary> /// Loads the plug-ins into memory. /// </summary> /// <returns>Returns the number of loaded plug-ins.</returns> public int LoadPlugins() { int count = 0; XmlDocument document = new XmlDocument(); document.Load(Path.Combine(Program.StartupPath, "TibiaTekPlus.Plugins.xml")); string path; foreach (XmlElement element in document["plugins"]["installed"]) { try { path = Path.Combine(Program.StartupPath, element.GetAttribute("fullname") + ".dll"); if (File.Exists(path)) { Plugin plugin = (Plugin)Activator.CreateInstance(Type.GetType(element["assemblyQualifiedName"].InnerText)); plugin.Host = this; plugins.Add(plugin); count++; if (PluginLoaded != null) { PluginLoaded.Invoke(plugin); } } else { MessageBox.Show(String.Format(Language.kernel_error1, element["title"], element["author"], element.GetAttribute("fullname")), Language.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception e) { MessageBox.Show(String.Format(Language.kernel_error2, element.GetAttribute("fullname"), e.StackTrace + "\n" + e.Message), Language.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); } } return(count); }
/// <summary> /// 加载插件 /// </summary> public static void Init() { if (s_Initialized) { return; } lock (s_InitLocker) { if (s_Initialized) { return; } //TODO:读取设置 string pluginFolder = Globals.GetPath(SystemDirecotry.Plugins); if (Directory.Exists(pluginFolder) == false) { s_Initialized = true; return; //throw new Exception(String.Format(Resources.PluginManager_PluginFolderNotFound, pluginFolder)); } PluginCollection plugins = new PluginCollection(); foreach (string dir in Directory.GetDirectories(pluginFolder)) { string pluginName = Path.GetFileNameWithoutExtension(dir); Type pluginType = null; if (BuildManager.CodeAssemblies != null) { foreach (Assembly assembly in BuildManager.CodeAssemblies) { pluginType = assembly.GetType("MaxLabs.bbsMax.Web.plugins." + pluginName, false, true); if (pluginType != null) { break; } } } if (pluginType == null) { pluginType = BuildManager.GetType("MaxLabs.bbsMax.Web.plugins." + pluginName, false); } if (pluginType != null) { PluginBase plugin = (PluginBase)Activator.CreateInstance(pluginType); if (plugin != null) { plugin.DoInitialize(); plugin.Name = pluginName; string pluginDisableFile = IOUtil.JoinPath(dir, "plugin_disabled"); plugin.Enable = File.Exists(pluginDisableFile) == false; plugins.Add(plugin); } } else { //TODO:记录下警告信息 } } s_Initialized = true; s_Plugins = plugins; } }
/// <summary> /// 获得插件对象 /// </summary> /// <param name="pluginCol">当前插件集合</param> /// <param name="_type">插件类型</param> private static void getPluginObject(PluginCollection pluginCol, Type _type) { IPlugin plugin = null; try { //object aa = Activator.CreateInstance(_type); //创建一个插件对象实例 plugin = Activator.CreateInstance(_type) as IPlugin; } catch { if (AppLog.log.IsErrorEnabled) { AppLog.log.Error(_type.FullName + "反射生成对象时发生异常"); } } finally { if (plugin != null) { //判断该插件是否已经存在插件集合中了,如果不是则加入该对象 if (!pluginCol.Contains(plugin)) { pluginCol.Add(plugin); } } } }
protected void Page_Load(object sender, EventArgs e) { pluginID = LoadPluginID(); rootFolder = Page.MapPath(""); if (!Page.IsPostBack) { pluginID = (!string.IsNullOrEmpty(Request.QueryString["plugin"]) ? Request.QueryString["plugin"] : pluginID); } try { PluginCollection Plugins = Plugin.GetPlugins(rootFolder, Page.Session, (Page as DefaultPage).Settings); installedPlugins.Clear(); foreach (Plugin pl in Plugins) { AdminPanelMainPlugin pctrl = (AdminPanelMainPlugin)LoadControl("../plugins/" + pl.FolderName + "/main.ascx"); pctrl.InitPlugin(); if (pctrl.CanLoadPlugin()) { installedPlugins.Add(pl); } } string mode = (!string.IsNullOrEmpty(Request.QueryString["mode"]) ? Request.QueryString["mode"] : string.Empty); if (!Page.IsPostBack) { switch (mode) { case "help": Response.Redirect((Page as DefaultPage).HelpUrl, false); break; } } if (string.IsNullOrEmpty(pluginID) && installedPlugins.Count > 0) { pluginID = installedPlugins[0].ID; } Plugin plugin = LoadPlugin(pluginID); if (plugin != null) { SavePluginID(plugin); } else { AdminPanelUtils.SetPageErrorMessage(Page, "Plugin not found!"); } WebMail.adminpanel.core.Menu ctrl = (WebMail.adminpanel.core.Menu)LoadControl("Menu.ascx"); if (ctrl != null) { ctrl.Plugins = installedPlugins; ctrl.pluginID = pluginID; menuPlaceHolder.Controls.Add(ctrl); } } catch (Exception ex) { Log.WriteException(ex); AdminPanelUtils.SetPageErrorMessage(Page, ex.Message + ": " + (ex.InnerException != null ? ex.InnerException.Message : ex.Message)); } }