Example #1
0
        public override void Execute(Script script)
        {
            // Generate the script code.
            var generator = new RoslynCodeGenerator();
            var code      = generator.Generate(script);

            _log.Verbose("Compiling build script...");
            RoslynSession.Execute(code);
        }
Example #2
0
        public override void Execute(Script script)
        {
            // Generate the script code.
            var generator = new RoslynCodeGenerator();
            var code      = generator.Generate(script);

            _log.Verbose("Compiling build script for debugging...");

            var submission = RoslynSession.CompileSubmission <CakeReport>(code);

            var compilation = (global::Roslyn.Compilers.CSharp.Compilation)submission.Compilation;

            compilation = compilation.WithOptions(compilation.Options
                                                  .WithOptimizations(false)
                                                  .WithDebugInformationKind(global::Roslyn.Compilers.Common.DebugInformationKind.Full));

            using (var outputStream = new MemoryStream())
                using (var pdbStream = new MemoryStream())
                {
                    var result = compilation.Emit(outputStream, null, null, pdbStream);

                    if (result.Success)
                    {
                        _log.Verbose("Compilation successful");

                        var assembly = AppDomain.CurrentDomain.Load(outputStream.ToArray(), pdbStream.ToArray());
                        var type     = assembly.GetType(CompiledType);
                        var method   = type.GetMethod(CompiledMethod, BindingFlags.Static | BindingFlags.Public);

                        method.Invoke(null, new[] { RoslynSession });
                    }
                    else
                    {
                        _log.Verbose("Compilation failed");

                        var errors  = string.Join(Environment.NewLine, result.Diagnostics.Select(x => x.ToString()));
                        var message = string.Format(System.Globalization.CultureInfo.InvariantCulture, "Error occurred when compiling: {0}", errors);

                        throw new CakeException(message);
                    }
                }
        }