Example #1
0
        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();
                }
            }
        }