using Newtonsoft.Json; using System; using System.Linq; using System.Reflection; namespace WWPipeLine.Commons { /// /// 动态库反射 /// public class ReflectionHelper { /// /// 反射静态方法调用 /// /// DLL的存放路径 /// 类名 /// 方法名 /// 方法参数列表 /// public static object GetStaticMethodObj(string dllFileName, string className, string methodName, object[] parameters) { Assembly assembly = Assembly.LoadFrom(dllFileName); if (assembly == null) { return null; } Type getType = assembly.GetType(className); if (getType == null) { return null; } MethodInfo methodInfo = getType.GetMethod(methodName); if (methodInfo == null) { return null; } return methodInfo.Invoke(null, parameters); } /// /// /// /// DLL的存放路径 /// 类名 /// 单例名称 /// 方法名 /// 参数列表 /// public static object GetSignleMethodObj(string dllFileName, string className, string singleName, string methodName, object[] parameters) { Assembly assembly = Assembly.LoadFrom(dllFileName); if (assembly == null) { return null; } Type type = assembly.GetType(className); if (type == null) { return null; } PropertyInfo info = type.GetProperty(singleName); if (info == null) { return null; } object obj = info.GetValue(null, null); if (obj == null) { return null; } return ExecutionMethod(obj, type, methodName, parameters); } /// /// 普通类反射调用方法 /// /// 库名 /// 类名 /// 方法名称 /// 参数 /// public static object GetComMethodObj(string dllFileName, string className, string methodName, object[] parameters) { Assembly assembly = Assembly.LoadFrom(dllFileName); if (assembly == null) { return null; } object obj = assembly.CreateInstance(className); if (obj == null) { return null; } Type type = obj.GetType(); if (type == null) { return null; } return ExecutionMethod(obj, type, methodName, parameters); } /// /// 已知对象,执行相应的函数 /// /// 执行对象 /// 执行对象对应的类型 /// 执行对象的需要执行的函数 /// 参数 /// public static object ExecutionMethod(object executionObj, Type type, string methodName, object[] parameters) { if (type == null) { return null; } //MethodInfo info = type.GetMethod.GetMethod(methodName); MethodInfo mathodGetAll = null; var mAll = type.GetMethods(); var mInfos = mAll.Where(f => f.Name == methodName); if (mInfos.Count() == 1) { mathodGetAll = mInfos.First(); } else { if (mAll != null && mAll.Any()) { mathodGetAll = mAll.FirstOrDefault(f => f.Name == methodName && f.GetParameters().Count() == parameters?.Count()); } } if (mathodGetAll == null) { return null; } var temParameters = mathodGetAll.GetParameters(); object[] objectParamList = null; Type[] typeArray; if (mathodGetAll.GetParameters().Length > 0) { if (parameters == null) { parameters = new object[0]; } typeArray = new Type[temParameters.Length]; ParameterInfo[] infoArray3 = mathodGetAll.GetParameters(); object[] objArray2 = new object[infoArray3.Length]; for (int i = 0; i < infoArray3.Length; i++) { if (i > parameters.Length - 1) { objArray2.SetValue(infoArray3[i].DefaultValue, i); } else if (parameters[i] == null) { objArray2.SetValue(parameters[i], i); } else { if (infoArray3[i].ParameterType.Name == "Object") { objArray2.SetValue(parameters[i], i); typeArray.SetValue(infoArray3[i].ParameterType, i); } else { JsonSerializer serializer = new JsonSerializer(); string s = SerializeHelper.JsonHepler.Json_SerializeObject(parameters[i], true); var temPtype = parameters[i].GetType(); object obj4 = serializer.Deserialize(new JsonTextReader(new System.IO.StringReader(s)), infoArray3[i].ParameterType.IsClass ? (infoArray3[i].ParameterType.Name == temPtype.Name ? infoArray3[i].ParameterType : temPtype) : infoArray3[i].ParameterType); objArray2.SetValue(obj4, i); if (obj4 != null) { typeArray.SetValue(infoArray3[i].ParameterType, i); } } } } objectParamList = objArray2; } object infoDatas = null; try { return infoDatas = mathodGetAll.Invoke(executionObj, objectParamList); } catch (Exception ex) { if (ex.InnerException != null) { if (ex.InnerException.Message.Contains("System.ServiceModel.Channels.ServiceChannel")) { throw new Exception("WCF服务无法连接!", ex); } if (ex.InnerException.Message.Contains("Connection open error")) { throw new Exception("数据库连接失败!", ex); } } LogHelper.Error(ex); return null; } } /// /// 创建类对象 /// /// 库名 /// 类名 /// public static object GetObjectFromDLL(string dllFileName, string className) { Assembly assembly = Assembly.LoadFrom(dllFileName); if (assembly == null) { return null; } return assembly.CreateInstance(className); } } }