//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("Neo.Compiler.MSIL console app v" + Assembly.GetEntryAssembly().GetName().Version); bool bCompatible = false; string filename = null; for (var i = 0; i < args.Length; i++) { if (args[i][0] == '-') { if (args[i] == "--compatible") { bCompatible = true; } //other option } else { filename = args[i]; } } if (filename == null) { log.Log("need one param for DLL filename."); log.Log("[--compatible] disable nep8 function"); log.Log("Example:neon abc.dll --compatible"); return; } if (bCompatible) { log.Log("use --compatible no nep8"); } string onlyname = System.IO.Path.GetFileNameWithoutExtension(filename); string filepdb = onlyname + ".pdb"; var path = Path.GetDirectoryName(filename); if (!string.IsNullOrEmpty(path)) { try { Directory.SetCurrentDirectory(path); } catch { log.Log("Could not find path: " + path); Environment.Exit(-1); } } 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; string jsonstr = null; //convert and build try { var conv = new ModuleConverter(log); ConvOption option = new ConvOption(); option.useNep8 = !bCompatible; NeoModule am = conv.Convert(mod, option); bytes = am.Build(); log.Log("convert succ"); try { var outjson = vmtool.FuncExport.Export(am, bytes); StringBuilder sb = new StringBuilder(); outjson.ConvertToStringWithFormat(sb, 0); jsonstr = sb.ToString(); log.Log("gen abi succ"); } catch (Exception err) { log.Log("gen abi Error:" + err.ToString()); } } catch (Exception err) { log.Log("Convert Error:" + err.ToString()); return; } //write bytes try { string bytesname = onlyname + ".avm"; 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 { string abiname = onlyname + ".abi.json"; System.IO.File.Delete(abiname); System.IO.File.WriteAllText(abiname, jsonstr); log.Log("write:" + abiname); bSucc = true; } catch (Exception err) { log.Log("Write abi Error:" + err.ToString()); return; } try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } if (bSucc) { log.Log("SUCC"); } }
public bool compile(string filename, string filetext, out byte[] avmtext, out string abitext, out string maptext, out string hash) { var tree = CSharpSyntaxTree.ParseText(filetext); var comp = CSharpCompilation.Create("aaa.dll", new[] { tree }, new[] { ref1, ref2, ref3, ref4 }, op); var fs = new MemoryStream(); var fspdb = new MemoryStream(); var result = comp.Emit(fs, fspdb); fs.Seek(0, SeekOrigin.Begin); fspdb.Seek(0, SeekOrigin.Begin); ILModule mod = new ILModule(); mod.LoadModule(fs, fspdb); NeoModule am = null; byte[] bytes = null; string jsonstr = null; string mapInfo = null; ConvOption option = new ConvOption() { useNep8 = false }; var conv = new ModuleConverter(new DefLogger()); am = conv.Convert(mod, option); // *.avm bytes = am.Build(); avmtext = bytes; // *.abi.json var outjson = vmtool.FuncExport.Export(am, bytes); jsonstr = outjson.ToString(); abitext = jsonstr; hash = outjson["hash"].ToString(); // *.map.json Neo.Compiler.MyJson.JsonNode_Array arr = new Neo.Compiler.MyJson.JsonNode_Array(); foreach (var m in am.mapMethods) { Neo.Compiler.MyJson.JsonNode_Object item = new Neo.Compiler.MyJson.JsonNode_Object(); arr.Add(item); item.SetDictValue("name", m.Value.displayName); item.SetDictValue("addr", m.Value.funcaddr.ToString("X04")); Neo.Compiler.MyJson.JsonNode_Array infos = new Neo.Compiler.MyJson.JsonNode_Array(); item.SetDictValue("map", infos); foreach (var c in m.Value.body_Codes) { if (c.Value.debugcode != null) { var debugcode = c.Value.debugcode.ToLower(); //if (debugcode.Contains(".cs")) { infos.AddArrayValue(c.Value.addr.ToString("X04") + "-" + c.Value.debugline.ToString()); } } } } mapInfo = arr.ToString(); maptext = mapInfo; try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } return(true); }
//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) { string outpath = "C:\\Neo\\SmartContracts"; //set console Console.OutputEncoding = System.Text.Encoding.UTF8; var log = new DefLogger(); log.Log("Neo.Compiler.MSIL(Debug) console app v" + Assembly.GetEntryAssembly().GetName().Version); if (args.Length == 0) { log.Log("need one param for DLL filename."); return; } log.Log("Debug output path=" + outpath); 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; string jsonstr = null; //convert and build NeoModule neoM = null; MyJson.JsonNode_Object abijson = null; try { var conv = new ModuleConverter(log); NeoModule am = conv.Convert(mod); neoM = am; bytes = am.Build(); log.Log("convert succ"); try { abijson = vmtool.FuncExport.Export(am, bytes); StringBuilder sb = new StringBuilder(); abijson.ConvertToStringWithFormat(sb, 0); jsonstr = sb.ToString(); log.Log("gen abi succ"); } catch (Exception err) { log.Log("gen abi Error:" + err.ToString()); } } catch (Exception err) { log.Log("Convert Error:" + err.ToString()); return; } //write bytes try { string bytesname = onlyname + ".avm"; 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; } //write abi try { string abiname = onlyname + ".abi.json"; System.IO.File.Delete(abiname); System.IO.File.WriteAllText(abiname, jsonstr); log.Log("write:" + abiname); bSucc = true; } catch (Exception err) { log.Log("Write abi Error:" + err.ToString()); return; } try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } if (bSucc) { _DebugOutput.DebugOutput(outpath, neoM, bytes, abijson); log.Log("SUCC"); } }
//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 bool Execute(string filename, string filepdb, ILogger log) { string onlyname = System.IO.Path.GetFileNameWithoutExtension(filename); 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(false); } //load module try { mod.LoadModule(fs, fspdb); } catch (Exception err) { log.Log("LoadModule Error:" + err.ToString()); return(false); } byte[] bytes = null; bool bSucc = false; string jsonstr = null; string debugmapstr = null; //convert and build try { var conv = new ModuleConverter(log); NeoModule am = conv.Convert(mod); bytes = am.Build(); log.Log("convert succ"); try { var outjson = vmtool.FuncExport.Export(am, bytes); StringBuilder sb = new StringBuilder(); outjson.ConvertToStringWithFormat(sb, 0); jsonstr = sb.ToString(); log.Log("gen abi succ"); } catch (Exception err) { log.Log("gen abi Error:" + err.ToString()); } try { var outjson = DebugInfo.ExportDebugInfo(onlyname, am); StringBuilder sb = new StringBuilder(); outjson.ConvertToStringWithFormat(sb, 0); debugmapstr = sb.ToString(); log.Log("gen debug map succ"); } catch (Exception err) { log.Log("gen debug map Error:" + err.ToString()); } } catch (Exception err) { log.Log("Convert Error:" + err.ToString()); return(false); } //write bytes try { string bytesname = onlyname + ".avm"; 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(false); } try { string abiname = onlyname + ".abi.json"; System.IO.File.Delete(abiname); System.IO.File.WriteAllText(abiname, jsonstr); log.Log("write:" + abiname); bSucc = true; } catch (Exception err) { log.Log("Write abi Error:" + err.ToString()); return(false); } try { string debugname = onlyname + ".debug.json"; System.IO.File.Delete(debugname); System.IO.File.WriteAllText(debugname, debugmapstr); log.Log("write:" + debugname); bSucc = true; } catch (Exception err) { log.Log("Write abi Error:" + err.ToString()); return(false); } try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } return(bSucc); }
//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) { var tree = Microsoft.CodeAnalysis.CSharp.CSharpSyntaxTree.ParseText("class A{public int aaa(){return 3;}}"); var op = new CSharpCompilationOptions(Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary); var ref1 = MetadataReference.CreateFromFile("needlib\\mscorlib.dll"); var comp = Microsoft.CodeAnalysis.CSharp.CSharpCompilation.Create("aaa.dll", new[] { tree }, new[] { ref1 }, op); var fs = new System.IO.MemoryStream(); var fspdb = new System.IO.MemoryStream(); var result = comp.Emit(fs, fspdb); fs.Seek(0, System.IO.SeekOrigin.Begin); fspdb.Seek(0, System.IO.SeekOrigin.Begin); //set console Console.OutputEncoding = System.Text.Encoding.UTF8; var log = new DefLogger(); log.Log("Neo.Compiler.MSIL(Debug) console app v" + Assembly.GetEntryAssembly().GetName().Version); 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; string jsonstr = null; //convert and build NeoModule neoM = null; MyJson.JsonNode_Object abijson = null; try { var conv = new ModuleConverter(log); NeoModule am = conv.Convert(mod); neoM = am; bytes = am.Build(); log.Log("convert succ"); try { abijson = vmtool.FuncExport.Export(am, bytes); StringBuilder sb = new StringBuilder(); abijson.ConvertToStringWithFormat(sb, 0); jsonstr = sb.ToString(); log.Log("gen abi succ"); } catch (Exception err) { log.Log("gen abi Error:" + err.ToString()); } } catch (Exception err) { log.Log("Convert Error:" + err.ToString()); return; } //write bytes try { string bytesname = onlyname + ".avm"; 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 { string abiname = onlyname + ".abi.json"; System.IO.File.Delete(abiname); System.IO.File.WriteAllText(abiname, jsonstr); log.Log("write:" + abiname); bSucc = true; } catch (Exception err) { log.Log("Write abi Error:" + err.ToString()); return; } try { fs.Dispose(); if (fspdb != null) { fspdb.Dispose(); } } catch { } if (bSucc) { _DebugOutput.DebugOutput(neoM, bytes, abijson); log.Log("SUCC"); } }