Tag: cci

使用带有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 […]

Microsoft CCI – 资源,编写编译器的参考资料

前段时间,我正在研究编译器,我使用System.Reflection从我的AST生成代码(IL)。 现在,我已经想到了另一个我想要处理的编译器(它将是另一个宠物项目,没有任何将在生产代码中使用,至少,现在不是)。 如您所知,宠物项目比生产代码有一个很大的优势:您可以尝试并失败。 所以,我决定尝试使用微软的CCI编写编译器。 我发现的唯一好的参考是基本语言的示例编译器(这是CCI在codeplex上的一部分),但是,我更喜欢有一些其他资源,更像是教程,书籍,文章,我可以获得除了学习代码之外的更多信息(这并不总是最好的学习方法,因为你看到了一个解决方案,但你不知道你有什么替代品,或者为什么这样的代码有效)。 那么:在编写编译器和处理AST的背景下,你有关于CCI的任何资源(教程,书籍)吗?

CCI vs. Mono.Cecil – 优点和缺点

我已经看过讨论这两个类似框架的文章,但大多数都是两年左右。 我认为这两个项目现在比两年前更加成熟,情况更复杂。 因此,考虑到每个图书馆的现状,我希望有人可以提供每个图书馆的优缺点的详细解释,目前应该首选。