public void BuildAssemblyRPC(System.Reflection.Assembly[] assems, string[] assemMacro, EngineNS.ECSType csType) { if (assems == null) { assems = AppDomain.CurrentDomain.GetAssemblies(); } List <RPCTypeInfo> AllClass = new List <RPCTypeInfo>(); for (var i = 0; i < assems.Length; i++) { try { var assm = assems[i]; if (assemMacro != null && assemMacro.Length == assems.Length && string.IsNullOrEmpty(assemMacro[i])) { assemMacro[i] = GetAssmemblyRPCMacro(assm); } foreach (var j in assm.GetTypes()) { if (j.IsSubclassOf(typeof(RPCProcessor))) { if (j.IsGenericType) { continue; } if (RPCProcessor.GetProcessor(j) == null) { RPCProcessor.InitProcessor(j); } } if (IsRPCClass(j)) { var tmp = new RPCTypeInfo(); tmp.Type = j; if (assemMacro != null && assemMacro.Length == assems.Length) { tmp.Macro = assemMacro[i]; } AllClass.Add(tmp); } } } catch (System.Exception ex) { EngineNS.Profiler.Log.WriteException(ex); } } //只有不会再被派生的类才能做RPC分析,否则就会出现一个RPCParameter被多个函数使用的情况 var finalKlass = GetFinalKlass(AllClass); foreach (var i in finalKlass) { RegClass(i.Type, i.Macro, csType); } RefreshRPCMap(null); }
public void RefreshRPCMap(List <System.Reflection.MethodInfo> funcs) { var rn = RName.GetRName("RPCMapping.xml"); var mappings = IO.XmlHolder.CreateObjectFromXML(rn) as RPCProcessorMapping; if (mappings == null) { #if PWindow mappings = new RPCProcessorMapping(); for (UInt16 i = 0; i < DescArray.Length; i++) { if (DescArray[i] == null) { continue; } var desc = new RPCProcessorMapping.Desc(); desc.ProcessorName = Rtti.RttiHelper.GetTypeSaveString(DescArray[i].GetType()); desc.Index = i; mappings.Descs.Add(desc); } IO.XmlHolder.SaveObjectToXML(mappings, rn); #endif } else { bool isdirty = false; RPCProcessor[] SavedDescArray = DescArray; DescArray = new RPCProcessor[MaxRPC]; for (UInt16 i = 0; i < (UInt16)mappings.Descs.Count; i++) { var type = Rtti.RttiHelper.GetTypeFromSaveString(mappings.Descs[i].ProcessorName); if (type == null) { isdirty = true; continue; } var proc = RPCProcessor.GetProcessor(type); if (proc == null) { isdirty = true; continue; } DescArray[mappings.Descs[i].Index] = proc; proc.RPCIndex = mappings.Descs[i].Index; } for (UInt16 i = 0; i < SavedDescArray.Length; i++) { if (SavedDescArray[i] == null) { continue; } bool finded = false; for (UInt16 j = 0; j < DescArray.Length; j++) { if (DescArray[j] == SavedDescArray[i]) { finded = true; break; } } if (finded == false) { var idx = this.FindValidIndex(); DescArray[idx] = SavedDescArray[i]; DescArray[idx].RPCIndex = idx; isdirty = true; } } if (isdirty) { #if PWindow Profiler.Log.WriteLine(Profiler.ELogTag.Info, "RPC", $"RPC mapping changed!"); mappings = new RPCProcessorMapping(); for (UInt16 i = 0; i < DescArray.Length; i++) { if (DescArray[i] == null) { continue; } var desc = new RPCProcessorMapping.Desc(); desc.ProcessorName = Rtti.RttiHelper.GetTypeSaveString(DescArray[i].GetType()); desc.Index = i; mappings.Descs.Add(desc); } IO.XmlHolder.SaveObjectToXML(mappings, rn); #endif } } }