Csharp/C#教程:使用带有ModuleBuilder而不是MemoryStream的Roslyn Emit方法分享


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

这个答案建议将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之前,不会释放此程序集。

上述就是C#学习教程:使用带有ModuleBuilder而不是MemoryStream的Roslyn Emit方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/956751.html

(0)
上一篇 2021年11月21日
下一篇 2021年11月21日

精彩推荐