公司給的一個小的practice
C# vs2017
Stage 1 (cmd)
1. Parse the dll (reflection)
2. Write all the public methods to a txt file (io)
Stage 2 (cmd)
1. Create a local database table
2. Read the txt file about the methods
3. Store the methods to datatable (ado.net)
Stage 3 (cmd)
1. Read the methods from database
2. generate two files to store the methods (one by json format, one by xml format)
3. Use (linq) to read the json file, count the public methods those under a dll, store it to a txt file
Stage1 解析一個dll並取出里面所有的public方法,寫入到txt中。先解析,用反射即可,這里要注意,因為有的dll是有其他依賴所以可能會無法解析,這里可以選擇自己寫一個dll,然后嘗試解析它。解析之后將其中的public方法寫入txt中。
using System; using System.Reflection; using System.IO; namespace Stage1 { class Program { //解析dll,將public方法寫入txt static void Main(string[] args) { StreamWriter sw = new StreamWriter(@"D:\\C#source\result.txt"); ; //獲取assembly Assembly asb = Assembly.LoadFrom(@"D:\C#source\Stage1\Temp\bin\Debug\netcoreapp2.0\Temp.dll"); //獲取module Module[] modules = asb.GetModules(); foreach (Module module in modules) { //獲取type Type[] types = module.GetTypes(); foreach (Type type in types) { //獲取method MethodInfo[] mis = type.GetMethods(); foreach (MethodInfo mi in mis) { sw.Write("Type:" + mi.ReturnType + " Name:" + mi.Name+ "\r\n"); } } } sw.Close(); Console.ReadKey(); } } }
Stage2 創建一個數據庫表,將txt中的方法讀入數據庫表中。這里要注意的就是,添加依賴的時候直接從NuGet中選擇就好,因為以前寫java比較多,這個就類似於java里的maven工具,自動添加依賴而不用手動添加。
using MySql.Data.MySqlClient; using System; using System.IO; using System.Text; namespace Stage2 { class Program { //txt中方法寫入數據庫 static void Main(string[] args) { MySqlConnection myconn = new MySqlConnection("Host =localhost;Database=dllmethod;Username=root;Password=314159"); myconn.Open(); MySqlCommand mycom = null; int index = 1; //讀取txt StreamReader sr = new StreamReader(@"D:\\C#source\result.txt", Encoding.Default); String line; while ((line = sr.ReadLine()) != null) { string sql = string.Format("insert into publicmethod(id,type,name) values( "); //處理line string method = line.ToString(); string methodType = method.Substring(5, method.IndexOf("Name") - 5); string methodName = method.Substring(method.IndexOf("Name:") + 5, method.Length - method.IndexOf("Name:") - 5); Console.WriteLine(methodType); Console.WriteLine(methodName); sql = sql + index + ",\"" + methodType + "\",\"" + methodName + "\")"; mycom= new MySqlCommand(sql, myconn); mycom.ExecuteNonQuery(); index++; } Console.ReadKey(); myconn.Close(); } } }
Stage3 把public方法從數據庫中都出來,一個導成json格式,一個導成xml格式,數據與json數據的轉換只需要序列化與反序列化即可,同時需要依賴一個Json Newtonsoft包,xml格式只需要一個XML包即可。linq讀取json保存的txt中,將json中的數據反序列化取出即可。
using MySql.Data.MySqlClient; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml.Linq; namespace Stage3 { class Program { static void Main(string[] args) { ToJson(); ToXML(); LinqToTxt(); Console.ReadKey(); } //linq讀取json,保存到txt中 static void LinqToTxt() { //從json中讀出 string fp = "D:\\C#source/MyJSON.json"; string json=File.ReadAllText(fp); Console.WriteLine(JsonConvert.DeserializeObject(json)); //寫入txt中 StreamWriter sw = new StreamWriter("D:\\C#source/JsonToTxt.txt"); string w = JsonConvert.DeserializeObject(json).ToString(); sw.Write(w); sw.Close(); } //生成json static void ToJson() { List<method> methods = getMethodFromDB(); string fp = "D:\\C#source/MyJSON.json"; if (!File.Exists(fp)) // 判斷是否已有相同文件 { FileStream fs1 = new FileStream(fp, FileMode.Create, FileAccess.ReadWrite); fs1.Close(); } File.WriteAllText(fp, JsonConvert.SerializeObject(methods)); Console.WriteLine(); } //生成xml static void ToXML() { List<method> methods=getMethodFromDB(); XDocument document = new XDocument(); XElement root = new XElement("Public"); XElement book = null; foreach (method method in methods) { book = new XElement("Method"+method.id); book.SetElementValue("type", method.type); book.SetElementValue("name", method.name); root.Add(book); } root.Save("d:\\C#source/MyXML.xml"); Console.WriteLine(); } //獲取數據庫中內容 static List<method> getMethodFromDB() { List<method> methods = new List<method>(); MySqlConnection myconn = new MySqlConnection("Host =localhost;Database=dllmethod;Username=root;Password=314159"); myconn.Open(); MySqlCommand sqlCmd = new MySqlCommand(); sqlCmd.Connection = myconn; sqlCmd.CommandText = "select * from publicmethod"; MySqlDataReader rec = sqlCmd.ExecuteReader(); //讀取publicmethod表中的內容到methods中 while (rec.Read()) { Console.WriteLine(" " + rec.GetInt32(0) + " " + rec.GetString(1) + " " + rec.GetString(2)); methods.Add(new method { id = "" + rec.GetInt32(0), type = "" + rec.GetString(1), name = "" + rec.GetString(2) }); } myconn.Close(); return methods; } } class method { public string id { get; set; } public string type { get; set; } public string name { get; set; } } }