public void CheckNewMetaClass() { var assems = Rtti.RttiHelper.GetAnalyseAssemblys(ECSType.All); foreach (var i in assems) { var types = i.Assembly.GetTypes(); foreach (var j in types) { var attrs = j.GetCustomAttributes(typeof(MetaClassAttribute), true); if (attrs == null || attrs.Length == 0) { continue; } var cname = RttiHelper.GetTypeSaveString(j); MetaClass klass; if (Klasses.TryGetValue(cname, out klass)) { continue; } CreateMetaClass(j); } } }
MetaClass CreateMetaClass(System.Type type) { var cname = RttiHelper.GetTypeSaveString(type); var klass = new MetaClass(); klass.MetaType = type; var csIdx = cname.IndexOf('|'); var fileName = cname; if (csIdx >= 0) { fileName = cname.Substring(csIdx + 1); } klass.ClassName = RName.GetRName(MetaDirectory.Name + "/" + fileName); MetaData curVer = new MetaData(); curVer.BuildMetaData(type); Hash64 hash = klass.GetFolderHash(); string dir = klass.ClassName.GetDirectory() + hash.ToString(); if (EngineNS.CEngine.Instance.FileManager.DirectoryExists(dir)) { bool hasRedirection = false; klass.LoadXnd(out hasRedirection); #if PWindow //if (hasRedirection) // klass.Save2Xnd(false); #endif MetaData data = klass.FindMetaData(curVer.MetaHash); if (data == null) { klass.RegMetaData(curVer.MetaHash, curVer); var xnd = IO.XndHolder.NewXNDHolder(); curVer.Save2Xnd(xnd.Node); IO.XndHolder.SaveXND(dir + "/" + curVer.MetaHash + ".MetaData", xnd); } } else { CEngine.Instance.FileManager.CreateDirectory(dir); var sw = new System.IO.StreamWriter(dir + "/typename.txt", false); sw.WriteLine(cname); sw.Close(); klass.RegMetaData(curVer.MetaHash, curVer); var xnd = IO.XndHolder.NewXNDHolder(); curVer.Save2Xnd(xnd.Node); IO.XndHolder.SaveXND(dir + "/" + curVer.MetaHash + ".MetaData", xnd); } klass.CurrentVersion = curVer; Klasses.Add(cname, klass); return(klass); }
public void RefreshMetaClass(Rtti.VAssembly assm) { if (assm == null) { return; } var types = assm.Assembly.GetTypes(); foreach (var j in types) { var attrs = j.GetCustomAttributes(typeof(MetaClassAttribute), true); if (attrs == null || attrs.Length == 0) { continue; } var cname = RttiHelper.GetTypeSaveString(j); MetaClass klass; if (Klasses.TryGetValue(cname, out klass)) { bool hasRedirection = false; if (klass.MetaNum == 0) { klass.LoadXnd(out hasRedirection); } if (!hasRedirection) { MetaData curVer = new MetaData(); curVer.BuildMetaData(j); MetaData data = klass.FindMetaData(curVer.MetaHash); if (data == null) { klass.RegMetaData(curVer.MetaHash, curVer); #if PWindow var xnd = IO.XndHolder.NewXNDHolder(); curVer.Save2Xnd(xnd.Node); var hash = klass.GetFolderHash(); var file = klass.ClassName.GetRootFolder() + "MetaClasses/" + hash.ToString() + "/" + curVer.MetaHash + ".MetaData"; IO.XndHolder.SaveXND(file, xnd); klass.CurrentVersion = curVer; #endif } else { klass.CurrentVersion = data; } } } else { CreateMetaClass(j); } } }
public void Save2Xnd(IO.XndNode node) { var attr = node.AddAttrib("Properties"); attr.BeginWrite(); attr.Write(RttiHelper.GetTypeSaveString(MetaType)); attr.Write(MetaHash); attr.Write(Members.Count); foreach (var i in Members) { attr.Write(RttiHelper.GetTypeSaveString(i.PropInfo.MemberType)); attr.Write(i.Name); } attr.EndWrite(); }
public Hash64 GetFolderHash() { var cname = RttiHelper.GetTypeSaveString(MetaType); cname = cname.Replace('+', '.'); cname = cname.ToLower(); var idx = cname.IndexOf('|'); if (idx >= 0) { cname = cname.Substring(idx + 1); } Hash64 hash = new Hash64(); Hash64.CalcHash64(ref hash, cname); return(hash); }