相关疑难解决方法(0)

使用带有ModuleBuilder而不是MemoryStream的Roslyn Emit方法

使用Roslyn编译为动态程序集时,我遇到了性能问题.编译花了大约3秒,相比之下,使用CodeDom编译器编译相同代码的时间约为300毫秒.这是我用来编译的代码的简化版本:

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());
}
Run Code Online (Sandbox Code Playgroud)

这个答案建议将ModuleBuilder对象传递给Emit方法而不是MemoryStream,以加快速度.我试图遵循这种模式,如下:

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());
Run Code Online (Sandbox Code Playgroud)

但我的Roslyn版本显然没有超载的Emit方法需要一个ModuleBuilder …

c# performance cci dynamic-assemblies roslyn

14
推荐指数
1
解决办法
3347
查看次数

标签 统计

c# ×1

cci ×1

dynamic-assemblies ×1

performance ×1

roslyn ×1