繁体   English   中英

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

[英]Using Roslyn Emit method with a ModuleBuilder instead of a MemoryStream

使用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());
}

这个答案建议将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());

但是我的Roslyn版本显然没有使用ModuleBuilderEmit方法的重载。 那个版本是:

Id: Microsoft.CodeAnalysis
版本: 0.6.4033103-beta(预发布)
项目信息: http //msdn.microsoft.com/en-US/roslyn

显然,这是一个预发布,所以api可能已经改变并不奇怪。 然而,

我的问题

  1. 有谁知道为什么Emit方法似乎不再有一个带有ModuleBuilder的重载?
  2. 有没有另一种方法可以在使用Roslyn的同时加快编译速度(Roslyn提供了一些优于CodeDom和Mono编译器的优点,我不想放弃)?

Roslyn目前不公开发射动态组件的能力。 我们删除它是因为它有问题。

您仍然可以使用Compilation.Emit API发送到MemoryStream ,然后使用Assembly.Load(byte[])来加载生成的二进制文件。

请注意,在卸载包含AppDomain之前,不会释放此程序集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM