Example #1
0
 public virtual void CompileToFile(string dllPath, string pdbPath)
 {
     if (PreCompiler())
     {
         var compilation   = GetCompilation();
         var CompileResult = compilation.Emit(dllPath, pdbPath);
         if (CompileResult.Success)
         {
             Assembly = Domain.CompileFileHandler(dllPath, pdbPath, AssemblyName);
             FileCompileSucceedHandler?.Invoke(dllPath, pdbPath, compilation);
         }
         else
         {
             FileCompileFailedHandler?.Invoke(dllPath, pdbPath, CompileResult.Diagnostics, compilation);
         }
     }
 }
Example #2
0
        public virtual void CompileToFile()
        {
            if (PreCompiler())
            {
                var options = GetCompilationOptions();
                OptionAction?.Invoke(options);
                var compilation   = GetCompilation(options);
                var CompileResult = CompileEmitToFile(compilation);

                if (CompileResult.Success)
                {
                    AssemblyResult = Domain.CompileFileHandler(DllPath, PdbPath, AssemblyName);
                    FileCompileSucceedHandler?.Invoke(DllPath, PdbPath, compilation);
                }
                else
                {
                    FileCompileFailedHandler?.Invoke(DllPath, PdbPath, CompileResult.Diagnostics, compilation);
                }
            }
        }
Example #3
0
        public virtual Assembly ComplieToAssembly(IEnumerable <SyntaxTree> trees)
        {
            Assembly   assembly      = null;
            EmitResult compileResult = null;

            if (PreCompiler())
            {
                if (trees == default)
                {
                    return(null);
                }

                var options = GetCompilationOptions();
                OptionAction?.Invoke(options);
                Compilation = GetCompilation(options);
                Compilation = (TCompilation)Compilation.AddSyntaxTrees(trees);
                foreach (var item in _semanticAnalysistor)
                {
                    Compilation = item(Compilation);
                }


                Stream outputStream = new MemoryStream();
                if (AssemblyOutputKind == AssemblyBuildKind.File)
                {
                    outputStream = File.Create(DllPath);
                    using (var pdbStream = File.Create(PdbPath))
                    {
                        compileResult = Compilation.Emit(
                            outputStream,
                            pdbStream: pdbStream,
                            options: new EmitOptions(pdbFilePath: PdbPath, debugInformationFormat: DebugInformationFormat.PortablePdb));
                    }
                }
                else
                {
                    compileResult = Compilation.Emit(
                        outputStream,
                        options: new EmitOptions(false, debugInformationFormat: DebugInformationFormat.PortablePdb));
                }

                if (compileResult.Success)
                {
                    Compilation.RemoveAllSyntaxTrees();
                    outputStream.Seek(0, SeekOrigin.Begin);
                    MemoryStream copyStream = new MemoryStream();
                    outputStream.CopyTo(copyStream);


                    outputStream.Seek(0, SeekOrigin.Begin);
                    assembly = Domain.CompileStreamCallback(outputStream, AssemblyName);

                    if (AssemblyOutputKind == AssemblyBuildKind.File)
                    {
                        FileCompileSucceedHandler?.Invoke(DllPath, PdbPath, Compilation);
                    }
                    else
                    {
                        StreamCompileSucceedHandler?.Invoke(copyStream, Compilation);
                    }
                    copyStream.Dispose();
                }
                else
                {
                    assembly = CompileFailedHandler?.Invoke(outputStream, compileResult.Diagnostics, Compilation);
                }
                outputStream.Dispose();
            }
            return(assembly);
        }