예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        /// <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);
            }
        }
예제 #3
0
        /// <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);
            }
        }
예제 #4
0
        /// <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());
            }
        }
예제 #5
0
        /// <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);
        }