public AntsModule Convert(ILModule _in) { logger.Log("beginConvert."); this.outModule = new AntsModule(this.logger); foreach (var t in _in.mapType) { if (t.Key[0] == '<') { continue; //系统的,不要 } if (t.Key.Contains("_API_")) { continue; //api的,不要 } foreach (var m in t.Value.methods) { if (m.Value.method == null) { continue; } AntsMethod nm = new AntsMethod(); nm.name = m.Value.method.FullName; this.methodLink[m.Value] = nm; outModule.mapMethods[nm.name] = nm; } } foreach (var t in _in.mapType) { if (t.Key[0] == '<') { continue; //系统的,不要 } if (t.Key.Contains("_API_")) { continue; //api的,不要 } foreach (var m in t.Value.methods) { if (m.Value.method == null) { continue; } var nm = this.methodLink[m.Value]; try { this.ConvertMethod(m.Value, nm); } catch (Exception err) { logger.Log("error:" + err.Message); } } } //转换完了,做个link,全部拼到一起 string mainmethod = ""; foreach (var key in outModule.mapMethods.Keys) { if (key.Contains("Verify")) { mainmethod = key; } } //得找到第一个函数 this.LinkCode(mainmethod); //this.findFirstFunc();//得找到第一个函数 //然后给每个method 分配一个func addr //还需要对所有的call 做一次地址转换 //this.outModule.Build(); return(outModule); }
public AntsModule Convert(ILModule _in) { //logger.Log("beginConvert."); this.outModule = new AntsModule(this.logger); foreach (var t in _in.mapType) { if (t.Key[0] == '<') { continue; //系统的,不要 } if (t.Key.Contains("_API_")) { continue; //api的,不要 } foreach (var m in t.Value.methods) { if (m.Value.method == null) { continue; } AntsMethod nm = new AntsMethod(); nm.name = m.Value.method.FullName; this.methodLink[m.Value] = nm; outModule.mapMethods[nm.name] = nm; } } foreach (var t in _in.mapType) { if (t.Key[0] == '<') { continue; //系统的,不要 } if (t.Key.Contains("_API_")) { continue; //api的,不要 } foreach (var m in t.Value.methods) { if (m.Value.method == null) { continue; } var nm = this.methodLink[m.Value]; //try { this.ConvertMethod(m.Value, nm); } //catch (Exception err) //{ // logger.Log("error:" + err.Message); //} } } //转换完了,做个link,全部拼到一起 string mainmethod = ""; foreach (var key in outModule.mapMethods.Keys) { if (key.Contains("::Verify(")) { var m = outModule.mapMethods[key]; foreach (var l in this.methodLink) { if (l.Value == m) { var srcm = l.Key.method; if (srcm.DeclaringType.BaseType.Name == "VerificationCode" && srcm.ReturnType.FullName == "System.Boolean") { logger.Log("找到函数入口点:" + key); if (mainmethod != "") { throw new Exception("拥有多个函数入口点,请检查"); } mainmethod = key; } } } } if (key.Contains("::Main(")) { var m = outModule.mapMethods[key]; foreach (var l in this.methodLink) { if (l.Value == m) { var srcm = l.Key.method; if (srcm.DeclaringType.BaseType.Name == "FunctionCode") { logger.Log("找到函数入口点:" + key); if (mainmethod != "") { throw new Exception("拥有多个函数入口点,请检查"); } mainmethod = key; } } } } } if (mainmethod == "") { throw new Exception("找不到入口函数,请检查"); } //得找到第一个函数 this.LinkCode(mainmethod); //this.findFirstFunc();//得找到第一个函数 //然后给每个method 分配一个func addr //还需要对所有的call 做一次地址转换 //this.outModule.Build(); return(outModule); }
//Console.WriteLine("helo ha:"+args[0]); //普通输出 //Console.WriteLine("<WARN> 这是一个严重的问题。");//警告输出,黄字 //Console.WriteLine("<WARN|aaaa.cs(1)> 这是ee一个严重的问题。");//警告输出,带文件名行号 //Console.WriteLine("<ERR> 这是一个严重的问题。");//错误输出,红字 //Console.WriteLine("<ERR|aaaa.cs> 这是ee一个严重的问题。");//错误输出,带文件名 //Console.WriteLine("SUCC");//输出这个表示编译成功 //控制台输出约定了特别的语法 public static void Main(string[] args) { //set console Console.OutputEncoding = System.Text.Encoding.UTF8; var log = new DefLogger(); log.Log("AntShars.Compiler.MSIL console app v0.01"); if (args.Length == 0) { log.Log("need one param for DLL filename."); return; } string filename = args[0]; string onlyname = System.IO.Path.GetFileNameWithoutExtension(filename); string filepdb = onlyname + ".pdb"; ILModule mod = new ILModule(); System.IO.Stream fs = null; System.IO.Stream fspdb = null; //open file try { fs = System.IO.File.OpenRead(filename); if (System.IO.File.Exists(filepdb)) { fspdb = System.IO.File.OpenRead(filepdb); } } catch (Exception err) { log.Log("Open File Error:" + err.ToString()); return; } //load module try { mod.LoadModule(fs, fspdb); } catch (Exception err) { log.Log("LoadModule Error:" + err.ToString()); return; } byte[] bytes = null; bool bSucc = false; //convert and build try { var conv = new ModuleConverter(log); AntsModule am = conv.Convert(mod); bytes = am.Build(); log.Log("convert succ"); } catch (Exception err) { log.Log("Convert Error:" + err.ToString()); return; } //write bytes try { string bytesname = onlyname + ".antshares.bytes"; System.IO.File.Delete(bytesname); System.IO.File.WriteAllBytes(bytesname, bytes); log.Log("write:" + bytesname); bSucc = true; } catch (Exception err) { log.Log("Write Bytes Error:" + err.ToString()); return; } try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } if (bSucc) { log.Log("SUCC"); } }