private List <LMethodInfo> LoadAssembly(string assemblyName) { List <LMethodInfo> funcLines = new List <LMethodInfo>(); m_Assembly = Assembly.LoadFile(assemblyName); var types = m_Assembly.GetTypes(); int methodId = 0; foreach (var type in types) { if (type.Namespace == null || !type.Namespace.Contains("LCL")) { continue; } if (type.Name.Contains("LCLFunctionDelegate") || type.Name.Contains("LCLRegisterFunctionDelegate")) { continue; } if (type.DeclaringType != null && ( type.DeclaringType.Name.Contains("LCLFunctionDelegate") || type.DeclaringType.Name.Contains("LCLRegisterFunctionDelegate") )) { continue; } var methodInfos = type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (var methodinfo in methodInfos) { //只处理本类的方法,派生方法不要 LMethodInfo info = new LMethodInfo(); var returnparamter = methodinfo.ReturnParameter; info.m_ReturnString = returnparamter.ParameterType.ToString(); if (info.m_ReturnString.Contains("Void")) { info.m_ReturnString = "void"; } var paramters = methodinfo.GetParameters(); if (paramters != null) { //添加this的object,每个委托都需要默认有一个 info.m_Params.Add(new ParamData() { m_ParamString = "System.Object", m_RefOut = RefOutArrayEnum.None }); foreach (var pi in paramters) { ParamData paramdata = new ParamData(); if (pi.IsOut) { //暂时不支持out paramdata.m_RefOut = RefOutArrayEnum.Out; continue; } else if (pi.ParameterType.IsByRef) { //暂时不支持ref paramdata.m_RefOut = RefOutArrayEnum.Ref; continue; } else if (pi.ParameterType.IsArray) { paramdata.m_RefOut = RefOutArrayEnum.Array; } paramdata.m_ParamString = pi.ParameterType.ToString().Replace("&", ""); info.m_Params.Add(paramdata); } } if (!funcLines.Exists((oldInfo) => { return(IsEqualLMethodInfo(oldInfo, info)); })) { funcLines.Add(info); } } } return(funcLines); }
private List <LMethodInfo> LoadAssembly(string assemblyName) { List <LMethodInfo> funcLines = new List <LMethodInfo>(); m_Assembly = Assembly.LoadFile(assemblyName); var types = m_Assembly.GetTypes(); Filter.NeedInjects.Clear(); //从所有类和参数中寻找需要处理的方法 List <MethodInfoSource> methodList = new List <MethodInfoSource>(); ParseTypes(types, methodList); List <MethodInfoSource> dealmethod = new List <MethodInfoSource>(); foreach (var methodinfoSource in methodList) { var methodinfo = methodinfoSource.mothodInfo; if (!FilterMethod(methodinfoSource, dealmethod)) { //添加委托信息 LMethodInfo info = new LMethodInfo(); var returnparamter = methodinfo.ReturnParameter; info.m_ReturnString = GetTypeName(returnparamter.ParameterType); if (info.m_ReturnString.Contains("Void")) { info.m_ReturnString = "void"; } var paramters = methodinfo.GetParameters(); if (paramters != null) { //为每一个普通的方法添加this的object,这个方法一般是需要注入的方法 if (methodinfoSource.source == MethodInfoSourceEnum.InjectMethod) { info.m_Params.Add(new ParamData() { m_ParamString = "System.Object", m_RefOut = RefOutArrayEnum.None }); } foreach (var pi in paramters) { ParamData paramdata = new ParamData(); if (pi.ParameterType.IsArray) { paramdata.m_RefOut = RefOutArrayEnum.Array; } paramdata.m_ParamString = GetTypeName(pi.ParameterType); info.m_Params.Add(paramdata); } } funcLines.Add(info); dealmethod.Add(methodinfoSource); } if (methodinfoSource.source == MethodInfoSourceEnum.InjectMethod) { string methodfullname = Filter.GetMethodFullName(methodinfo); Filter.NeedInjects.Add(methodfullname); } } return(funcLines); }
private List <LMethodInfo> LoadAssembly(string assemblyName) { List <LMethodInfo> funcLines = new List <LMethodInfo>(); m_Assembly = Assembly.LoadFile(assemblyName); var types = m_Assembly.GetTypes(); int methodId = 0; Filter.NeedInjects.Clear(); foreach (var type in types) { if (type.Namespace == null || !type.Namespace.Contains("LCL")) { continue; } if (!Filter.FilterType(type)) { continue; } if (type.Name.Contains("LCLFunctionDelegate") || type.Name.Contains("LCLRegisterFunctionDelegate")) { continue; } if (type.DeclaringType != null && ( type.DeclaringType.Name.Contains("LCLFunctionDelegate") || type.DeclaringType.Name.Contains("LCLRegisterFunctionDelegate") )) { continue; } Filter.NeedInjects.Add(type.FullName); var methodInfos = type.GetMethods(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (var methodinfo in methodInfos) { if (!Filter.FilterMethod(methodinfo)) { continue; } //只处理本类的方法,派生方法不要 LMethodInfo info = new LMethodInfo(); var returnparamter = methodinfo.ReturnParameter; info.m_ReturnString = returnparamter.ParameterType.ToString(); if (info.m_ReturnString.Contains("Void")) { info.m_ReturnString = "void"; } var paramters = methodinfo.GetParameters(); if (paramters != null) { //添加this的object,每个委托都需要默认有一个 info.m_Params.Add(new ParamData() { m_ParamString = "System.Object", m_RefOut = RefOutArrayEnum.None }); foreach (var pi in paramters) { ParamData paramdata = new ParamData(); if (pi.IsOut) { //暂时不支持out paramdata.m_RefOut = RefOutArrayEnum.Out; continue; } else if (pi.ParameterType.IsByRef) { //暂时不支持ref paramdata.m_RefOut = RefOutArrayEnum.Ref; continue; } else if (pi.ParameterType.IsArray) { paramdata.m_RefOut = RefOutArrayEnum.Array; } paramdata.m_ParamString = pi.ParameterType.ToString().Replace("&", ""); info.m_Params.Add(paramdata); } } string returnstr = methodinfo.ReturnType.FullName; string name = methodinfo.DeclaringType.FullName + "::" + methodinfo.Name; string paramstr = ""; int count = methodinfo.GetParameters().Length; int index = 1; foreach (var param in methodinfo.GetParameters()) { string split = index++ == count ? "" : ","; paramstr += param.ParameterType.FullName + split; } string methodfullname = returnstr + " " + name + "(" + paramstr + ")"; Filter.NeedInjects.Add(methodfullname); if (!funcLines.Exists((oldInfo) => { return(IsEqualLMethodInfo(oldInfo, info)); })) { funcLines.Add(info); } } } return(funcLines); }