/// <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 { } } }
/// <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 { } } } }