标签: cci

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

我已经看过讨论这两个类似框架的文章,但大多数都是两年左右.我认为这两个项目现在比两年前更加成熟,情况更复杂.

因此,考虑到每个图书馆的现状,我希望有人可以提供每个图书馆的优缺点的详细解释,目前应该首选.

.net c# cci mono.cecil

20
推荐指数
1
解决办法
1638
查看次数

Mono Cecil与PostSharp Core对比Microsoft CCI实施AOP框架

哪个在功能,易用性,文档,示例,社区/支持,VS集成,已知实现,长期可行性以及实现自定义AOP框架的构建速度方面更好?

我将从我所知道的开始(到目前为止我只尝试过PostSharp):

  • Microsoft Common Compiler Instrastruture(CCI):我读过,它用于FxCop,ILMerge,Spec#和Code Contracts.它似乎是非常低的水平,因为它甚至没有注意纠正当用它修改IL时borken的分支代码的偏移.
  • PostSharp已有5年的历史,有很多AOP功能(例如,提取一些你需要手动完成IL的事情),源代码可用,只有一个人开发/支持,但他正计划将此作为一项业务,有文档但可能更好,构建需要大约两倍的时间,很少有关于如何注入IL和2.0版本的样本将很快发布,这有望得到很大改善.
  • Mono Cecil:由一个人编写,是Mono套件的一部分,Reflector的插件名为Reflexil,使用Mono Cecil.

.net aop postsharp cci mono.cecil

15
推荐指数
1
解决办法
6145
查看次数

使用带有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
查看次数

是否有类似ASM for Java Bytecode的CIL静态分析库?

我正在寻找一个库,用于对CIL代码进行自定义静态代码分析.阅读:我对已经进行静态分析的工具不感兴趣,就像这里显示的那样.

对于使用Java Bytecodes的自定义分析,我使用了ASM,我喜欢它提供的功能和良好的文档.快速谷歌搜索"CIL静态分析库"不会产生任何似乎提供ASM功能的东西.

cil static-analysis cci java-bytecode-asm

5
推荐指数
1
解决办法
659
查看次数