public static void Compile(string code, bool isDebug, out Assembly compiledAssembly, out IList <string> errors, out IList <string> warnings) { var assemblyName = "CodeGenerationAssembly" + Interlocked.Increment(ref _suffix); var assemblyPath = Path.Combine(SerializerDebugging.DumpDirectory ?? Path.GetTempPath(), assemblyName + ".dll"); using (var provider = CodeDomProvider.CreateProvider("C#")) { var parameters = new CompilerParameters { GenerateInMemory = false, OutputAssembly = assemblyPath }; foreach (var assembly in SerializerDebugging.CodeSerializerDependentAssemblies) { parameters.ReferencedAssemblies.Add(( string )assembly); } var result = provider.CompileAssemblyFromSource( parameters, code ); errors = BuildCompilationError(result.Errors.OfType <CompilerError>().Where(d => !d.IsWarning)); warnings = BuildCompilationError(result.Errors.OfType <CompilerError>().Where(d => d.IsWarning)); if (!errors.Any()) { SerializerDebugging.AddCompiledCodeAssembly(result.PathToAssembly); compiledAssembly = result.CompiledAssembly; } else { compiledAssembly = null; } } }
public static void Compile(string code, bool isDebug, out Assembly compiledAssembly, out IList <string> errors, out IList <string> warnings) { var assemblyName = "CodeGenerationAssembly" + Interlocked.Increment(ref _suffix); var metadataList = SerializerDebugging.CodeSerializerDependentAssemblies.Select( a => a is string ?AssemblyMetadata.CreateFromFile(a as string) : AssemblyMetadata.CreateFromImage(a as byte[]) ).ToArray(); try { var compilation = CSharpCompilation.Create( assemblyName, new[] { CSharpSyntaxTree.ParseText(code) }, metadataList.Select(m => m.GetReference()), new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, optimizationLevel: isDebug?OptimizationLevel.Debug: OptimizationLevel.Release, // Suppress CS0436 because gen/*.cs will conflict with testing serializers. specificDiagnosticOptions: new[] { new KeyValuePair <string, ReportDiagnostic>("CS0436", ReportDiagnostic.Suppress) } ) ); var emitOptions = new EmitOptions(runtimeMetadataVersion: "v4.0.30319"); EmitResult result; if (SerializerDebugging.DumpEnabled) { var assemblyPath = Path.Combine(SerializerDebugging.DumpDirectory, assemblyName + ".dll"); using (var fileStream = File.OpenWrite(assemblyPath)) { result = compilation.Emit(fileStream, options: emitOptions); fileStream.Flush(); } if (result.Success) { compiledAssembly = Assembly.LoadFrom(assemblyPath); SerializerDebugging.AddCompiledCodeAssembly(assemblyPath); } else { compiledAssembly = null; } } else { using (var buffer = new MemoryStream()) { result = compilation.Emit(buffer, options: emitOptions); if (result.Success) { var image = buffer.ToArray(); compiledAssembly = Assembly.Load(image); SerializerDebugging.AddCompiledCodeAssembly(assemblyName, image); } else { compiledAssembly = null; } } } errors = BuildCompilationError(result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Error)); warnings = BuildCompilationError(result.Diagnostics.Where(d => d.Severity == DiagnosticSeverity.Warning)); } finally { foreach (var metadata in metadataList) { metadata.Dispose(); } } }