Usando o método Roslyn Emit com um ModuleBuilder em vez de um MemoryStream
Eu estava tendo problemas com o desempenho ao usar o Roslyn para compilar em um assembly dinâmico. A compilação estava demorando ~ 3 segundos, em comparação com ~ 300 milissegundos para compilar o mesmo código ao usar oCodeDom
compilador. Aqui está uma versão reduzida do código que estou usando para fazer a compilação:
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 resposta sugere passar um objeto ModuleBuilder para o método Emit em vez de um MemoryStream para acelerar as coisas. Eu tentei seguir esse padrão, assim:
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());
Mas minha versão de Roslyn aparentemente não tem uma sobrecarga doEmit
método que leva umModuleBuilder
. Essa versão é:
Eu iria: Microsoft.CodeAnalysis
Versão: 0.6.4033103-beta (Pré-lançamento)
Informações do Projeto: http://msdn.microsoft.com/pt-BR/roslyn
Obviamente, este é um pré-lançamento, portanto, não é estranho que a API tenha mudado. Contudo,
Minhas perguntas)Alguém sabe por que oEmit
O método não parece mais ter uma sobrecarga que leva umModuleBuilder
?Existe outra maneira de tornar essa compilação mais rápida enquanto ainda usa o Roslyn (o Roslyn oferece algumas vantagens sobre oCodeDom
e compiladores Mono que eu preferiria não desistir)?