什么是IL编织?

我今天刚刚看到Ayende的post关于PostSharp。 我下载了代码并试了一下,我认为这是最酷,最容易使用的方式来处理我见过的AOP。

Ayende在post中说,PostSharp通过IL Weaving完成了它的魔法。 现在,在某种抽象层面上,我可以推断出这是什么意思,但我想看看是否有更详细的答案。 不幸的是,在很长一段时间里,Google第一次为我空了。 所以我认为这对于StackOverflow是一个很好的问题(因为我已经订阅了Jeff的博客几年了,知道这个网站正在做它的事情)。

那么IL Weaving究竟是什么呢?它是如何完成的?

编织是指将function注入现有程序的过程。 这可以在多个层面在概念上完成:

  • 源代码编织会在编译代码之前注入源代码行
  • IL编织(用于.NET)将代码作为IL指令添加到程序集中
  • ByteCode编织(对于Java)在类文件上工作,请参阅关于AspectJ的注释

从理论上讲,你可以更深入地编织一个编译成本地指令的可执行文件,但是这会增加很多复杂性,而且我不知道任何这样做。

IL编织与ByteCode Weaving类似。 .Net编译成由.NET clr运行的中间语言。 IL编织基本上是分析和改变中间语言。 由于它是在这个级别完成的,所以可以为所有.NET语言完成。

如果你使用Google MSIL Injection,可能会有所帮助。 这个链接来自PostSharp ,它解释得很好。

我公司最近购买了一款名为dynaTrace的产品来进行性能诊断。 它使用MSIL注入方法周围的仪器。 基本上它会在你的方法之前和时间之后添加IL代码(我相信这里面有很多)。

这是一个相当有说服力,但很好的解释过程。