Пример #1
0
        /// <summary>
        /// 将 .proto 文件转成 .cs 文件
        /// <para>用于项目非ProtoBuf-net类型协议,以后用PB协议的话这里就没有用了</para>
        /// </summary>
        /// <param name="inPath"></param>
        /// <param name="inFolderName"></param>
        /// <returns></returns>
        public bool Proto2CSharp(string inPath, string inFolderName)
        {
            Assist.CheckFolderExist(inFolderName);
            Assist.DeleteFilesInFolder("ProtoItem");

            Assist.GetObjPaths(".proto", inPath).ForEach(delegate(string path)
            {
                FileInfo targetFileInfo = new FileInfo(path);
                bool bCommonClass       = path.EndsWith("_comm.proto");

                // 类名 -> 成员列表<成员名, 成员类型>
                Dictionary <string, Dictionary <string, string> > nClasses = null;
                if (targetFileInfo != null)
                {
                    Queue <string> sq = new Queue <string>();
                    StreamReader sr   = new StreamReader(path, System.Text.Encoding.Default);
                    string line;
                    while (!sr.EndOfStream)
                    {
                        line = sr.ReadLine().Trim();
                        line = Regex.Replace(line, @"/{2}.+", "");// 去掉“//”行
                        line = Regex.Replace(line, @"{\s*", "");
                        sq.Enqueue(line);
                    }
                    sr.Close();
                    sr.Dispose();

                    string curNameSpace = sq.Dequeue().Remove(0, 8).Replace(";", "");

                    nClasses = HanldQueue(sq);

                    foreach (KeyValuePair <string, Dictionary <string, string> > fieldStr in nClasses)
                    {
                        if (fieldStr.Key != "")
                        {
                            ProtoToCSharp ptcs = new ProtoToCSharp(curNameSpace, fieldStr.Key, "ProtoItem");
                            try
                            {
                                ptcs.Create(fieldStr.Value, bCommonClass);
                            }
                            catch (Exception exp)
                            {
                                throw new Exception(exp.ToString() + ", Class" + fieldStr);
                            }
                        }
                    }
                }
                if (bCommonClass)
                {
                    AutoCSharp.Do.Creator.TypeMapper.InitProtoAssembly();
                }
            });
            return(true);
        }
Пример #2
0
        /// <summary>
        /// Excel -> .cs
        /// </summary>
        /// <param name="inFolderPath">输出文件夹名</param>
        /// <param name="suffixName">文件后缀名</param>
        /// <param name="inNameSpace">命名空间</param>
        /// <param name="inHeritNames">继承</param>
        /// <returns></returns>
        public bool Excel(string inPath, string inFolderName, string suffixName, string inNameSpace = "", string inHeritNames = "")
        {
            Assist.CheckFolderExist(inFolderName);
            Assist.DeleteFilesInFolder(inFolderName);

            Dictionary <string, string[]> finalclassname = new Dictionary <string, string[]>();

            //Load Cfg XML
            string cfgPath = Assist.RootPath + "Cfg";;
            Dictionary <string, XmlDocument> dicXML = Assist.GetXml(cfgPath);
            string      xmlName;
            XmlNodeList nodeList;
            Dictionary <string, string> dicFunctions = new Dictionary <string, string>();

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "Functions")
                {
                    //保证先Load Functions.xml
                    nodeList = xml.GetElementsByTagName("function");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                dicFunctions[attr.Value] = node.InnerText;
                                break;
                            }
                        }
                    }
                    break;
                }
            }

            Dictionary <string, ExcelToCSharp> dicEc = new Dictionary <string, ExcelToCSharp>();
            string tableName = "";
            string tableDes  = "";

            string          cfgName = "", desName = "", fieldName;
            ExcelToCSharp   e;
            List <string[]> values;

            foreach (XmlDocument xml in dicXML.Values)
            {
                xmlName = xml.DocumentElement.Name;
                if (xmlName == "CfgItems")
                {
                    nodeList = xml.GetElementsByTagName("cfg");
                    foreach (XmlNode node in nodeList)
                    {
                        foreach (XmlAttribute attr in node.Attributes)
                        {
                            if (attr.Name == "name")
                            {
                                cfgName = attr.Value;
                            }
                            else if (attr.Name == "des")
                            {
                                desName = attr.Value;
                            }
                        }
                        //finalclassname.Add(cfgName, desName);
                        e = new ExcelToCSharp(inHeritNames, "Cfg" + Assist.FirstLetterUp(cfgName), inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);
                        values = new List <string[]>();
                        foreach (XmlNode paramNode in node.ChildNodes)
                        {
                            string[] v = new string[4];
                            foreach (XmlAttribute attr in paramNode.Attributes)
                            {
                                fieldName = attr.Name;
                                if (fieldName == "name")
                                {
                                    v[0] = attr.Value;
                                }
                                else if (fieldName == "type")
                                {
                                    v[1] = attr.Value;
                                }
                                else if (fieldName == "des")
                                {
                                    v[2] = attr.Value;
                                }
                                else if (fieldName == "link")
                                {
                                    v[3] = attr.Value;
                                }
                            }
                            values.Add(v);
                        }
                        e.SetValue(cfgName, values);
                        dicEc.Add(cfgName, e);
                    }
                }
            }

            try
            {
                Assist.GetObjPaths(suffixName, inPath).ForEach(delegate(string path)
                {
                    DataTable dt = null;
                    bool bExcel  = true;
                    if (suffixName == ".xlsx")
                    {
                        DataSet ds = Assist.ExcelToData(path);
                        dt         = ds.Tables[0];
                    }
                    else if (suffixName == ".txt")
                    {
                        tableDes = path;
                        dt       = Assist.TxtToData(path);
                        bExcel   = false;
                    }

                    if (dt != null)
                    {
                        // ===================== 类名注释 ========================

                        string acn  = path.Contains("(") ? path.Split('(')[1] : path.Split('(')[1];
                        string acnn = acn.Contains(")") ? acn.Split(')')[0] : acn.Split(')')[0];
                        tableDes    = acnn;
                        // =======================================================
                        tableName = Assist.FirstLetterUp(dt.TableName);
                        e         = new ExcelToCSharp(inHeritNames, "Cfg" + tableName, inFolderName, dicFunctions);
                        e.SetInherit(inHeritNames);

                        DataRowCollection rows = dt.Rows;
                        values              = new List <string[]>();
                        string note         = null;
                        string strFieldName = null;
                        for (int x = 0; x < dt.Columns.Count; x++)
                        {
                            if (rows[2][x].ToString() != "")
                            {
                                string[] v = new string[4];
                                v[0]       = rows[0][x].ToString().Trim();
                                v[1]       = rows[2][x].ToString().Trim();
                                if (bExcel)
                                {
                                    v[2] = rows[1][x].ToString().Trim();
                                    v[3] = rows[3][x].ToString().Trim();
                                }
                                else
                                {
                                    strFieldName = rows[1][x].ToString().Trim();
                                    note         = rows[3][x].ToString().Trim();
                                    v[2]         = note == "" ? strFieldName : string.Concat(strFieldName, ";", note);
                                    v[3]         = rows[4][x].ToString().Trim();
                                }

                                values.Add(v);
                            }
                        }
                        e.SetValue(acnn, values);
                        dicEc.Add(tableName, e);

                        finalclassname.Add(dt.TableName, new string[] { acnn, e.GetKeyType() });
                    }
                });
            }
            catch (Exception ex)
            {
                throw new Exception(tableDes + ex.Message + "可能是Excel打开表左下角的名字跟其它表重复。");
            }

            foreach (ExcelToCSharp ec in dicEc.Values)
            {
                ec.CreateCode(dicEc);
            }

            CreatePBData final = new CreatePBData(inHeritNames, "PBData", inFolderName);

            final.SetValue(finalclassname);
            return(true);
        }