public static bool Execute(string fileName, ILogger logger) { var code = File.ReadAllText(fileName); var options = new CSharpParseOptions(kind: SourceCodeKind.Regular, languageVersion: LanguageVersion.Latest); SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code, options, fileName, System.Text.Encoding.UTF8); // note - This path must patch the .NET framework version used to build the Neo.SmartContract.Framework.dll string programFilesX86 = Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%"); string assemblyPath = programFilesX86 + @"\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\"; var neededAssemblies = new string[] { "mscorlib", "System", "System.Numerics", }; List <MetadataReference> references = neededAssemblies.Select(x => MetadataReference.CreateFromFile(assemblyPath + x + ".dll")).ToList <MetadataReference>(); var exePath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); references.Add(MetadataReference.CreateFromFile(exePath + @"\Neo.SmartContract.Framework.dll")); var contractName = Path.GetFileNameWithoutExtension(fileName); var assemblyName = exePath + @"\" + contractName + ".dll"; var compileOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug, allowUnsafe: true); Compilation compilation = CSharpCompilation.Create("Contract", options: compileOptions, references: references, syntaxTrees: new[] { syntaxTree }); var pdbName = assemblyName.Replace(".dll", ".pdb"); var assemblyStream = new FileStream(assemblyName, FileMode.Create); var pdbStream = new FileStream(pdbName, FileMode.Create); var emitResult = compilation.Emit(assemblyStream, pdbStream); assemblyStream.Close(); pdbStream.Close(); if (emitResult.Success) { /*assemblyStream.Seek(0, SeekOrigin.Begin); * AssemblyDefinition assemblyInfo = AssemblyDefinition.ReadAssembly(assemblyStream); * * var mod = assemblyInfo.Modules.FirstOrDefault(); * foreach (var t in mod.Types) * { * if (!t.Name.StartsWith("<")) * { * GenerateMainMethod(t); * } * } */ return(AVMCompiler.Execute(assemblyName, pdbName, logger)); } else { foreach (var d in emitResult.Diagnostics) { var lineSpan = d.Location.GetLineSpan(); var startLine = lineSpan.StartLinePosition.Line; logger.Log(string.Format("Line {0}: {1}", startLine, d.GetMessage())); } return(false); } }
public static bool Execute(string fileName, ILogger logger) { var code = File.ReadAllText(fileName); var MaxLanguageVersion = Enum .GetValues(typeof(LanguageVersion)) .Cast <LanguageVersion>() .Max(); var options = new CSharpParseOptions(kind: SourceCodeKind.Regular, languageVersion: MaxLanguageVersion); SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code, options, fileName, System.Text.Encoding.UTF8); /*var assemblyPath = ((string)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator); * var neededAssemblies = new[] * { * "mscorlib", * "System.Runtime", * "System.Core", * "System.Numerics", * "Neo.SmartContract.Framework", * }; * * IEnumerable<MetadataReference> references = assemblyPath * .Where(p => neededAssemblies.Contains(Path.GetFileNameWithoutExtension(p))) * .Select(p => MetadataReference.CreateFromFile(p)) * .ToList(); * */ string assemblyPath = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\"; var neededAssemblies = new string[] { "mscorlib", "System", "System.Numerics", }; List <MetadataReference> references = neededAssemblies.Select(x => MetadataReference.CreateFromFile(assemblyPath + x + ".dll")).ToList <MetadataReference>(); var exePath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); references.Add(MetadataReference.CreateFromFile(exePath + @"\Neo.SmartContract.Framework.dll")); var contractName = Path.GetFileNameWithoutExtension(fileName); var assemblyName = exePath + @"\" + contractName + ".dll"; var compileOptions = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug, allowUnsafe: true); Compilation compilation = CSharpCompilation.Create("Contract", options: compileOptions, references: references, syntaxTrees: new[] { syntaxTree }); var pdbName = assemblyName.Replace(".dll", ".pdb"); var assemblyStream = new FileStream(assemblyName, FileMode.Create); var pdbStream = new FileStream(pdbName, FileMode.Create); var emitResult = compilation.Emit(assemblyStream, pdbStream); assemblyStream.Close(); pdbStream.Close(); if (emitResult.Success) { /*assemblyStream.Seek(0, SeekOrigin.Begin); * AssemblyDefinition assemblyInfo = AssemblyDefinition.ReadAssembly(assemblyStream); * * var mod = assemblyInfo.Modules.FirstOrDefault(); * foreach (var t in mod.Types) * { * if (!t.Name.StartsWith("<")) * { * GenerateMainMethod(t); * } * } */ return(AVMCompiler.Execute(assemblyName, pdbName, logger)); } else { foreach (var d in emitResult.Diagnostics) { var lineSpan = d.Location.GetLineSpan(); var startLine = lineSpan.StartLinePosition.Line; logger.Log(string.Format("Line {0}: {1}", startLine, d.GetMessage())); } return(false); } }
//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 + " [DEBUGGER SUPPORT]"); if (args.Length == 0) { log.Log("need one param for DLL filename."); return; } string filename = args[0]; log.Log("Trying to compile " + filename); var extension = Path.GetExtension(filename); string filepdb = filename.Replace(extension, ".pdb"); // fix necessary when debugging the compiler via VS var path = Path.GetDirectoryName(filename); if (!string.IsNullOrEmpty(path)) { try { Directory.SetCurrentDirectory(path); } catch { log.Log("Could not find path: " + path); Environment.Exit(-1); } } if (!File.Exists(filename)) { log.Log("Could not find file: " + filename); Environment.Exit(-1); } switch (extension) { case ".dll": { if (AVMCompiler.Execute(filename, filepdb, log)) { log.Log("SUCC"); } break; } case ".cs": { if (CSharpCompiler.Execute(filename, log)) { log.Log("SUCC"); } break; } default: { log.Log("Invalid extension: " + extension); Environment.Exit(-1); break; } } }