Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        //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;
            }
            }
        }