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

This answer建议将ModuleBuilder对象而不是MemoryStream传递给Emit方法,以加快处理速度。我尝试遵循这种模式,如下所示:
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版本显然没有采用EmitModuleBuilder方法的重载。该版本是:

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

显然,这是一个预发行版本,因此api可能已更改并不奇怪。然而,

我的问题
  • 有人知道为什么Emit方法似乎不再具有需要ModuleBuilder的重载吗?
  • 是否还有另一种方法可以在仍使用Roslyn的同时使此编译速度更快(Roslyn与CodeDom和Mono编译器相比,我有很多优势,我不想放弃)。
  • 最佳答案

    Roslyn当前不具备发出动态程序集的功能。我们删除了它,因为它有问题。

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

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

    关于c# - 将Roslyn Emit方法与ModuleBuilder而不是MemoryStream一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22974473/

    10-13 01:04