예제 #1
0
        /// <summary>
        /// 获取一个单例对象。
        /// </summary>
        /// <returns></returns>
        public static CSPluginsConfigManager GetInstance()
        {
            if (_instance == null)
            {
                _instance = new CSPluginsConfigManager();
            }

            return(_instance);
        }
예제 #2
0
        /// <summary>
        /// 代理为NativeClr方式时,调用执行方法。
        /// </summary>
        /// <param name="methodName"></param>
        /// <param name="parameters"></param>
        private static void CallMethod(string methodName, object[] parameters)
        {
            //获取插件应用目录。
            string pluginFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CSharpPlugins");

            foreach (string pluginFile in Directory.GetFiles(pluginFolder, "*.dll"))
            {
                try
                {
                    string pluginFileName = Path.GetFileNameWithoutExtension(pluginFile);

                    if (!CSPluginsConfigManager.GetInstance().GetLoadingStatus(pluginFileName))
                    {
                        continue;
                    }

                    //将Dll加载到二进制数组,再从数组加载Dll类。
                    Assembly assembly = Assembly.Load(File.ReadAllBytes(pluginFile));

                    //遍历程序集中所有的数据类型。
                    foreach (Type type in assembly.GetTypes())
                    {
                        if (!type.IsClass || type.IsNotPublic)
                        {
                            continue;
                        }

                        //获取全部继承的接口。
                        Type[] tempInterfaces = type.GetInterfaces();

                        //判断是否继承自ICQAssembly。
                        if (tempInterfaces.Select(s => s.Name).Contains("ICQAssembly"))
                        {
                            //Object theObj = Activator.CreateInstance(type);
                            Object theObj = CQAppContainer.GetInstance().ClrApps[pluginFile];
                            //反射到初始化方法,并执行。
                            //MethodInfo mi = type.GetMethod(methodName);
                            Dictionary <string, MethodInfo> dicMethods = CQAppContainer.GetInstance().ClrMethods[pluginFile];
                            MethodInfo mi          = dicMethods[methodName];
                            Object     returnValue = mi.Invoke(theObj, parameters);
                        }
                    }
                }
                catch
                {
                }
            }
        }
예제 #3
0
        /// <summary>
        /// 加载插件列表。
        /// </summary>
        private void LoadApps()
        {
            lock (_syncRoot)
            {
                this._apps          = new List <CQAppAbstract>();
                this._dicClrApps    = new Dictionary <string, object>();
                this._dicClrMethods = new Dictionary <string, Dictionary <string, MethodInfo> >();

                //获取插件应用目录。
                string pluginFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CSharpPlugins");

                //目录不存在则返回空列表。
                if (!Directory.Exists(pluginFolder))
                {
                    Directory.CreateDirectory(pluginFolder);
                    return;
                }

                //遍历所有文件。
                foreach (string pluginFile in Directory.GetFiles(pluginFolder, "*.dll"))
                {
                    string pluginName = Path.GetFileNameWithoutExtension(pluginFile);

                    bool status = CSPluginsConfigManager.GetInstance().GetLoadingStatus(pluginName);

                    try
                    {
                        //将Dll加载到二进制数组,再从数组加载Dll类。
                        Assembly assembly = Assembly.Load(File.ReadAllBytes(pluginFile));

                        //遍历程序集中所有的数据类型。
                        foreach (Type type in assembly.GetTypes())
                        {
                            if (!type.IsClass || type.IsNotPublic)
                            {
                                continue;
                            }

                            //获取全部继承的接口。
                            Type[] tempInterfaces = type.GetInterfaces();

                            //判断是否继承自ICQAssembly。
                            if (tempInterfaces.Select(s => s.Name).Contains("ICQAssembly"))
                            {
                                if (CQ.ProxyType == CQProxyType.NativeClr)
                                {
                                    Object theObj = Activator.CreateInstance(type);
                                    this._dicClrApps.Add(pluginFile, theObj);

                                    Dictionary <string, MethodInfo> dicMethods = new Dictionary <string, MethodInfo>();

                                    MethodInfo[] mis = type.GetMethods();

                                    foreach (MethodInfo mi in mis)
                                    {
                                        dicMethods.Add(mi.Name, mi);
                                    }

                                    this._dicClrMethods.Add(pluginFile, dicMethods);

                                    //反射到初始化方法,并执行。
                                    MethodInfo initMethod = type.GetMethod("Initialize");
                                    initMethod.Invoke(theObj, null);

                                    if (status)
                                    {
                                        //反射到启动方法,并执行。
                                        MethodInfo startMethod = type.GetMethod("Startup");
                                        startMethod.Invoke(theObj, null);
                                    }
                                }

                                /**
                                 * 不管是UDP还是NativeClr方式,都执行下面的代码,考虑到NativeClr方式要启动配置界面,所以才这么做;
                                 * 如果只是从酷Q通过C++反射调用页不是从代理界面中打开的,执行下面的代码会抛异常,不会影响程序的运行。
                                 */

                                CQAppAbstract plugin = (CQAppAbstract)Activator.CreateInstance(type, null);

                                plugin.AssemblyPath  = pluginFile;
                                plugin.RunningStatus = status;

                                //初始化插件。
                                plugin.Initialize();

                                this._apps.Add(plugin);

                                if (!status)
                                {
                                    plugin.Name = "[未启用]" + plugin.Name;
                                }
                                else
                                {
                                    plugin.Startup();
                                }
                            }
                        }
                    }
                    catch
                    {
                    }
                }
            }
        }