private CompileResult BuildFull(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildFull"); _options = options; _referenceFileList = new FileTimeList(); _referenceFileList.Update(options.References); _sourceFileList = new FileTimeList(); _sourceFileList.Update(options.Files); _referenceMap = options.References.ToDictionary( file => file, file => CreateReference(file)); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); _sourceMap = options.Files.ToDictionary( file => file, file => ParseSource(file, parseOption)); _compilation = CSharpCompilation.Create( options.AssemblyName, _sourceMap.Values, _referenceMap.Values, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); Emit(result); return result; }
private CompileResult BuildFull(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildFull"); _options = options; _referenceFileList = new FileTimeList(); _referenceFileList.Update(options.References); _sourceFileList = new FileTimeList(); _sourceFileList.Update(options.Files); _referenceMap = options.References.ToDictionary( file => file, file => CreateReference(file)); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); _sourceMap = options.Files.ToDictionary( file => file, file => ParseSource(file, parseOption)); var specificDiagnosticOptions = options.NoWarnings.ToDictionary(x => x, _ => ReportDiagnostic.Suppress); _compilation = CSharpCompilation.Create( options.AssemblyName, _sourceMap.Values, _referenceMap.Values, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) .WithSpecificDiagnosticOptions(specificDiagnosticOptions) .WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default) .WithAllowUnsafe(options.Options.Contains("-unsafe"))); Emit(result); return result; }
private CompileResult BuildIncremental(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildIncremental"); _options = options; // update reference files var referenceChanges = _referenceFileList.Update(options.References); foreach (var file in referenceChanges.Added) { _logger.Info("+ {0}", file); var reference = CreateReference(file); _compilation = _compilation.AddReferences(reference); _referenceMap.Add(file, reference); } foreach (var file in referenceChanges.Changed) { _logger.Info("* {0}", file); var reference = CreateReference(file); _compilation = _compilation.RemoveReferences(_referenceMap[file]) .AddReferences(reference); _referenceMap[file] = reference; } foreach (var file in referenceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveReferences(_referenceMap[file]); _referenceMap.Remove(file); } // update source files var sourceChanges = _sourceFileList.Update(options.Files); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); foreach (var file in sourceChanges.Added) { _logger.Info("+ {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.AddSyntaxTrees(syntaxTree); _sourceMap.Add(file, syntaxTree); } foreach (var file in sourceChanges.Changed) { _logger.Info("* {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]) .AddSyntaxTrees(syntaxTree); _sourceMap[file] = syntaxTree; } foreach (var file in sourceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]); _sourceMap.Remove(file); } // emit or reuse prebuilt output var reusePrebuilt = _outputDllStream != null && ( (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoChange && sourceChanges.Empty && referenceChanges.Empty) || (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoSourceChange && sourceChanges.Empty && referenceChanges.Added.Count == 0 && referenceChanges.Removed.Count == 0)); if (reusePrebuilt) { _logger.Info("Reuse prebuilt output"); // write dll var dllFile = Path.Combine(_options.WorkDirectory, _options.Output); using (var dllStream = new FileStream(dllFile, FileMode.Create)) { _outputDllStream.Seek(0L, SeekOrigin.Begin); _outputDllStream.CopyTo(dllStream); } // write pdb or mdb switch (_options.DebugSymbolFile) { case DebugSymbolFileType.Pdb: var pdbFile = Path.Combine(_options.WorkDirectory, Path.ChangeExtension(_options.Output, ".pdb")); using (var debugSymbolStream = new FileStream(pdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; case DebugSymbolFileType.PdbToMdb: case DebugSymbolFileType.Mdb: var mdbFile = Path.Combine(_options.WorkDirectory, _options.Output + ".mdb"); using (var debugSymbolStream = new FileStream(mdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; } result.Succeeded = true; } else { _logger.Info("Emit"); Emit(result); } return result; }
private void Emit(CompileResult result) { _outputDllStream = new MemoryStream(); _outputDebugSymbolStream = _options.DebugSymbolFile != DebugSymbolFileType.None ? new MemoryStream() : null; // emit to memory var r = _options.DebugSymbolFile == DebugSymbolFileType.Mdb ? _compilation.EmitWithMdb(_outputDllStream, _outputDebugSymbolStream) : _compilation.Emit(_outputDllStream, _outputDebugSymbolStream); // memory to file var dllFile = Path.Combine(_options.WorkDirectory, _options.Output); var mdbFile = Path.Combine(_options.WorkDirectory, _options.Output + ".mdb"); var pdbFile = Path.Combine(_options.WorkDirectory, Path.ChangeExtension(_options.Output, ".pdb")); var emitDebugSymbolFile = _options.DebugSymbolFile == DebugSymbolFileType.Mdb ? mdbFile : pdbFile; using (var dllStream = new FileStream(dllFile, FileMode.Create)) { _outputDllStream.Seek(0L, SeekOrigin.Begin); _outputDllStream.CopyTo(dllStream); } if (_outputDebugSymbolStream != null) { using (var debugSymbolStream = new FileStream(emitDebugSymbolFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } } // gather result foreach (var d in r.Diagnostics) { if (d.Severity == DiagnosticSeverity.Warning && d.IsWarningAsError == false) result.Warnings.Add(GetDiagnosticString(d, "warning")); else if (d.Severity == DiagnosticSeverity.Error || d.IsWarningAsError) result.Errors.Add(GetDiagnosticString(d, "error")); } result.Succeeded = r.Success; // pdb to mdb when required if (_options.DebugSymbolFile == DebugSymbolFileType.PdbToMdb) { var code = ConvertPdb2Mdb(dllFile); _logger.Info("pdb2mdb exited with {0}", code); File.Delete(pdbFile); // read converted mdb file to cache contents _outputDebugSymbolStream = new MemoryStream(File.ReadAllBytes(mdbFile)); } }
private CompileResult BuildIncremental(CompileOptions options) { var result = new CompileResult(); _logger.Info("BuildIncremental"); _options = options; // update reference files var referenceChanges = _referenceFileList.Update(options.References); foreach (var file in referenceChanges.Added) { _logger.Info("+ {0}", file); var reference = CreateReference(file); _compilation = _compilation.AddReferences(reference); _referenceMap.Add(file, reference); } foreach (var file in referenceChanges.Changed) { _logger.Info("* {0}", file); var reference = CreateReference(file); _compilation = _compilation.RemoveReferences(_referenceMap[file]) .AddReferences(reference); _referenceMap[file] = reference; } foreach (var file in referenceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveReferences(_referenceMap[file]); _referenceMap.Remove(file); } // update source files var sourceChanges = _sourceFileList.Update(options.Files); var parseOption = new CSharpParseOptions(LanguageVersion.CSharp6, DocumentationMode.Parse, SourceCodeKind.Regular, options.Defines); foreach (var file in sourceChanges.Added) { _logger.Info("+ {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.AddSyntaxTrees(syntaxTree); _sourceMap.Add(file, syntaxTree); } foreach (var file in sourceChanges.Changed) { _logger.Info("* {0}", file); var syntaxTree = ParseSource(file, parseOption); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]) .AddSyntaxTrees(syntaxTree); _sourceMap[file] = syntaxTree; } foreach (var file in sourceChanges.Removed) { _logger.Info("- {0}", file); _compilation = _compilation.RemoveSyntaxTrees(_sourceMap[file]); _sourceMap.Remove(file); } // emit or reuse prebuilt output var reusePrebuilt = _outputDllStream != null && ( (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoChange && sourceChanges.Empty && referenceChanges.Empty) || (_options.PrebuiltOutputReuse == PrebuiltOutputReuseType.WhenNoSourceChange && sourceChanges.Empty && referenceChanges.Added.Count == 0 && referenceChanges.Removed.Count == 0)); if (reusePrebuilt) { _logger.Info("Reuse prebuilt output"); // write dll var dllFile = Path.Combine(_options.WorkDirectory, _options.Output); using (var dllStream = new FileStream(dllFile, FileMode.Create)) { _outputDllStream.Seek(0L, SeekOrigin.Begin); _outputDllStream.CopyTo(dllStream); } // write pdb or mdb switch (_options.DebugSymbolFile) { case DebugSymbolFileType.Pdb: var pdbFile = Path.Combine(_options.WorkDirectory, Path.ChangeExtension(_options.Output, ".pdb")); using (var debugSymbolStream = new FileStream(pdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; case DebugSymbolFileType.PdbToMdb: case DebugSymbolFileType.Mdb: var mdbFile = Path.Combine(_options.WorkDirectory, _options.Output + ".mdb"); using (var debugSymbolStream = new FileStream(mdbFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } break; } result.Succeeded = true; } else { _logger.Info("Emit"); Emit(result); } return(result); }
private void Emit(CompileResult result) { _outputDllStream = new MemoryStream(); _outputDebugSymbolStream = _options.DebugSymbolFile != DebugSymbolFileType.None ? new MemoryStream() : null; // emit to memory var r = _options.DebugSymbolFile == DebugSymbolFileType.Mdb ? _compilation.EmitWithMdb(_outputDllStream, _outputDebugSymbolStream) : _compilation.Emit(_outputDllStream, _outputDebugSymbolStream); // memory to file var dllFile = Path.Combine(_options.WorkDirectory, _options.Output); var mdbFile = Path.Combine(_options.WorkDirectory, _options.Output + ".mdb"); var pdbFile = Path.Combine(_options.WorkDirectory, Path.ChangeExtension(_options.Output, ".pdb")); var emitDebugSymbolFile = _options.DebugSymbolFile == DebugSymbolFileType.Mdb ? mdbFile : pdbFile; using (var dllStream = new FileStream(dllFile, FileMode.Create)) { _outputDllStream.Seek(0L, SeekOrigin.Begin); _outputDllStream.CopyTo(dllStream); } if (_outputDebugSymbolStream != null) { using (var debugSymbolStream = new FileStream(emitDebugSymbolFile, FileMode.Create)) { _outputDebugSymbolStream.Seek(0L, SeekOrigin.Begin); _outputDebugSymbolStream.CopyTo(debugSymbolStream); } } // gather result foreach (var d in r.Diagnostics) { if (d.Severity == DiagnosticSeverity.Warning && d.IsWarningAsError == false) { result.Warnings.Add(GetDiagnosticString(d, "warning")); } else if (d.Severity == DiagnosticSeverity.Error || d.IsWarningAsError) { result.Errors.Add(GetDiagnosticString(d, "error")); } } result.Succeeded = r.Success; // pdb to mdb when required if (_options.DebugSymbolFile == DebugSymbolFileType.PdbToMdb) { var code = ConvertPdb2Mdb(dllFile); _logger.Info("pdb2mdb exited with {0}", code); File.Delete(pdbFile); // read converted mdb file to cache contents _outputDebugSymbolStream = new MemoryStream(File.ReadAllBytes(mdbFile)); } }