예제 #1
0
        public virtual void CompileToStream()
        {
            if (PreCompiler())
            {
                var          compilation   = GetCompilation();
                MemoryStream stream        = new MemoryStream();
                var          CompileResult = EmitToStream(compilation, stream);


                if (CompileResult.Success)
                {
                    stream.Position = 0;
                    MemoryStream copyStream = new MemoryStream();
                    stream.CopyTo(copyStream);
                    stream.Position = 0;
                    Assembly        = Domain.CompileStreamHandler(stream, AssemblyName);
                    StreamCompileSucceedHandler?.Invoke(copyStream, compilation);
                    copyStream.Dispose();
                }
                else
                {
                    stream.Position = 0;
                    StreamCompileFailedHandler?.Invoke(stream, CompileResult.Diagnostics, compilation);
                }
                stream.Dispose();
            }
        }
예제 #2
0
        public virtual void CompileToStream()
        {
            if (PreCompiler())
            {
                var options = GetCompilationOptions();
                OptionAction?.Invoke(options);
                var          compilation   = GetCompilation(options);
                MemoryStream stream        = new MemoryStream();
                var          CompileResult = CompileEmitToStream(compilation, stream);


                if (CompileResult.Success)
                {
                    stream.Seek(0, SeekOrigin.Begin);
                    MemoryStream copyStream = new MemoryStream();
                    stream.CopyTo(copyStream);
                    stream.Seek(0, SeekOrigin.Begin);
                    AssemblyResult = Domain.CompileStreamHandler(stream, AssemblyName);
                    StreamCompileSucceedHandler?.Invoke(copyStream, compilation);
                    copyStream.Dispose();
                }
                else
                {
                    stream.Seek(0, SeekOrigin.Begin);
                    StreamCompileFailedHandler?.Invoke(stream, CompileResult.Diagnostics, compilation);
                }
                stream.Dispose();
            }
        }
예제 #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);
        }