Uso del método Roslyn Emit con un ModuleBuilder en lugar de un MemoryStream

Estaba teniendo problemas con el rendimiento al usar Roslyn para compilar en un ensamblaje dinámico. La compilación tardaba ~ 3 segundos, en comparación con ~ 300 milisegundos para compilar el mismo código cuando se usaCodeDom compilador. Aquí hay una versión reducida del código que estoy usando para hacer la compilación:

var compilation = CSharpCompilation.Create(
                                      "UserPayRules.dll",
                                      syntaxTrees,
                                      assembliesToAdd);

using (var stream = new MemoryStream())
{
    stopWatch.Start();
    var result = compilation.Emit(stream);
    stopWatch.Stop();
    Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
    if (!result.Success)
    {
        throw new InvalidOperationException();
    }
    var assembly = Assembly.Load(stream.GetBuffer());
}

Esta respuesta sugiere pasar un objeto ModuleBuilder al método Emit en lugar de un MemoryStream para acelerar las cosas. Traté de seguir ese patrón, así:

var compilation = CSharpCompilation.Create(
                                      "UserPayRules.dll",
                                      syntaxTrees,
                                      assembliesToAdd);

var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
                                       new AssemblyName("ThisAssembly"),
                                       AssemblyBuilderAccess.RunAndCollect);

var moduleBuilder = assemblyBuilder.DefineDynamicModule("ThisModule");
var result = compilation.Emit(moduleBuilder);

Debug.WriteLine("Compilation: {0}", stopWatch.ElapsedMilliseconds);
if (!result.Success)
{
    throw new InvalidOperationException();
}
var assembly = Assembly.Load(stream.GetBuffer());

Pero mi versión de Roslyn aparentemente no tiene una sobrecarga delEmit método que toma unModuleBuilder. Esa versión es:

Carné de identidad: Microsoft.CodeAnalysis
Versión: 0.6.4033103-beta (versión preliminar)
Información del proyecto: http://msdn.microsoft.com/en-US/roslyn

Obviamente, esta es una presentación preliminar, por lo que no es extraño que la API haya cambiado. Sin embargo,

Mis preguntas)¿Alguien sabe por quéEmit El método ya no parece tener una sobrecarga que requiere unModuleBuilder?¿Hay alguna otra manera de hacer esta compilación más rápido mientras se sigue usando Roslyn (Roslyn ofrece un par de ventajas sobreCodeDom y compiladores Mono que preferiría no renunciar)

Respuestas a la pregunta(1)

Su respuesta a la pregunta