/// <summary> /// 从指定目录添加目录中的插件到m_Pluginlist中 /// 实现Plugins.AddFromDir接口 /// </summary> /// <param name="path">目录路径</param> /// <returns></returns> public bool AddFromDir(string path) { if (m_Locked) { return(false); } int count = 0; ArrayList ar = PluginManagementTools.FindPluginDLLs(path); foreach (string s in ar) { if (AddFromFile(s)) { count++; } } if (count > 0 && count <= ar.Count) { return(true); } else { return(false); } }
/// <summary> /// 从默认目录(Plugins)将插件添加到m_Pluginlist中 /// </summary> /// <returns></returns> internal bool LoadPlugins() { if (m_Locked) { return(false); } int count = 0; PluginFolder = App.Path + "\\Plugins"; //bin目录下的Plugins文件夹 ArrayList PotentialPlugins = PluginManagementTools.FindPluginDLLs(PluginFolder); //包含完整路径的文件名 for (int i = 0; i < PotentialPlugins.Count; i++) { PluginInfo info = new PluginInfo(); try { if (PotentialPlugins.IndexOf("RemoveMe-Script") > 0) //删除用RemoveMe-Script标识的插件 { System.IO.File.Delete(PotentialPlugins[i].ToString()); } else if (info.Init(PotentialPlugins[i].ToString(), typeof(MapWinGIS.Interfaces.IPlugin).GUID)) //存在 { if (m_PluginList.ContainsKey(info.Key) == false) { m_PluginList.Add(info.Key, info); count++; } else { //插件重复 string dupfile = m_PluginList[info.Key].FileName; if (!(dupfile.ToLower() == PotentialPlugins[i].ToString().ToLower())) { MapWinGIS.Utility.Logger.Msg("警告: 检测到插件重复." + "\r\n" + "\r\n" + "加载的插件是: " + dupfile + "\r\n" + "重复的插件被忽略: " + PotentialPlugins[i].ToString(), "插件重复", System.Windows.Forms.MessageBoxIcon.Exclamation); } } } } catch (Exception ex) { MapWinGIS.Utility.Logger.Dbg(ex.ToString()); } } //确保有插件记录添加到m_PluginList中 if (count > 0 && count <= PotentialPlugins.Count) { return(true); } else { return(false); } }
/// <summary> /// 是否存在指定键的插件。若存在于m_Pluginlist中,则添加到m_LoadPlugins中 /// 实现Plugins.StartPlugin接口 /// </summary> /// <param name="key">插件的Key</param> /// <returns></returns> public bool StartPlugin(string key) { if (m_Locked) { return(false); } MapWinGIS.Interfaces.IPlugin plugin; PluginInfo info; if (m_LoadedPlugins.ContainsKey(key))//在m_LoadedPlugins中搜索,有 - 已经加载不再加载 { return(true); } if (m_PluginList.ContainsKey(key)) //在m_PluginList中搜索,有 - 创建实例,添加到m_LoadedPlugins中 { try { info = m_PluginList[key]; plugin = (IPlugin)(PluginManagementTools.CreatePluginObject(info.FileName, info.CreateString)); if (plugin == null) { return(false); } m_LoadedPlugins.Add(info.Key, plugin); plugin.Initialize(Program.frmMain, Program.frmMain.Handle.ToInt32());//调用插件中的方法进行初始化 Program.frmMain.SynchPluginMenu(); return(true); } catch (Exception ex) { Program.g_error = "插件出现错误: " + ex.ToString(); Program.ShowError(ex); return(false); } } else { return(false); } }
/// <summary> /// 从ApplicationPlugins文件夹中加载内部插件 /// </summary> /// <param name="applicationPluginPath"></param> internal void LoadApplicationPlugins(string applicationPluginPath) { if (applicationPluginPath == "" || !System.IO.Directory.Exists(applicationPluginPath)) { return; } ArrayList arr = new ArrayList(); try { ArrayList potentialPlugins = PluginManagementTools.FindPluginDLLs(applicationPluginPath); PluginInfo info; IPlugin plugin; foreach (string pluginName in potentialPlugins) { info = new PluginInfo(); if (info.Init(pluginName, typeof(IPlugin).GUID)) { if (info.Key != null && !m_ApplicationPlugins.ContainsKey(info.Key)) { plugin = (IPlugin)PluginManagementTools.CreatePluginObject(pluginName, info.CreateString); if (plugin != null) { m_ApplicationPlugins.Add(info.Key, plugin); plugin.Initialize(Program.frmMain, Program.frmMain.Handle.ToInt32()); } } } } } catch (Exception e) { MapWinGIS.Utility.Logger.Dbg(e.ToString()); } }
/// <summary> /// 初始化.Net插件程序集,获取程序集的基本信息 /// </summary> /// <param name="assemblyInfo">当前程序集中的某个coclass类型(这里是获取的接口类型)信息</param> /// <param name="pathToFile">程序集的路径(包含文件名)</param> /// <returns></returns> private bool InitAssembly(System.Type assemblyInfo, string pathToFile) { System.Reflection.Assembly asm; try { m_CoClassGUID = ("{" + assemblyInfo.GUID.ToString() + "}").ToUpper(); //获取插件的GUID m_CoClassName = assemblyInfo.Name; //类型名,实现IPlugin接口的接口名 m_Filename = pathToFile; //插件完整路径 m_CreateString = PluginManagementTools.GetCreateString(assemblyInfo); //程序集的全名eg:GIStools.GISTool m_Key = PluginManagementTools.GenerateKey(assemblyInfo); //key eg:GIStools_GISTool asm = System.Reflection.Assembly.GetAssembly(assemblyInfo); //获取该程序集 try { //abstract类不加载 if (asm.GetType(m_CreateString).Attributes == System.Reflection.TypeAttributes.Abstract) { return(false); } } catch (Exception e) { MapWinGIS.Utility.Logger.Dbg("检查类型是否为抽象类型是出错: " + asm.GetType(m_CreateString).Attributes.ToString() + e.ToString()); } try { object o = asm.CreateInstance(m_CreateString); if (o is IPlugin) { IPlugin plugin = (IPlugin)o; m_Author = plugin.Author; m_BuildDate = plugin.BuildDate; m_Description = plugin.Description; m_Name = plugin.Name; if (m_Name == null || m_Name.Length == 0) { return(false); } m_Version = plugin.Version; plugin = null; asm = null; o = null; } else { return(false); } } catch (Exception ex) { Program.g_error = ex.ToString(); MapWinGIS.Utility.Logger.Message("插件 \'" + pathToFile + ("\' 加载失败!" + "\r\n" + "原因: " + ex.ToString())); MapWinGIS.Utility.Logger.Dbg(ex.ToString()); return(false); } } catch (System.Exception ex) { Program.g_error = ex.ToString(); MapWinGIS.Utility.Logger.Dbg(ex.ToString()); return(false); } return(true); }