为什么编译后代码注入比预编译代码注入更好?

所以我们都知道C#没有类似C的宏预处理器(这里有一个很好的线程)。 但是现在AOP正在获得牵引力,似乎我们开始使用后处理器来处理我们曾经使用预处理器的事情(请记住,我只是在使用PostSharp,所以可能不在)。

我是C#中属性的忠实粉丝,但是如果一个预处理器被遗漏了很多理由(作为一个前MFC用户,我仍然质疑但仍然接受)为什么编译后代码注入比预先更好?编译代码注入?

我在5年前设计PostSharp时选择后编译的原因是:

  1. 语言不可知论。
  2. 与高级语言(每两年进行一次非平凡更新)相比,MSIL具有更稳定的规范。
  3. 大多数情况下,MSIL是处理方面时所需的抽象级别。 您不需要知道所有等效结构(想想’使用’和’try-finally’)。
  4. 在2008年之前,没有人成功地生成了一个像样的C#编译器。 Mono遇到的困难足够令人印象深刻,即使他们现在已经赶上了。
  5. 处理二进制文件似乎比处理源代码要快得多。
  6. 处理二进制程序集可以执行它 – 正在处理的程序集可以自行转换。 在PostSharp老挝首次发布之前,这是闻所未闻的。

也就是说,AOP for C / C ++的实现确实是预编译器(WeaveC),Java中的实现是编译器扩展(出于Java编译器的许多OSS实现的原因)。

-gael

从技术上讲,Visual Studio中内置了C#的预编译选项: 文本模板转换工具包(T4) 。 这允许您在预编译步骤中执行相当惊人的事情,并且是许多产品的基础,例如一些ORM等。

如果您要进行预编译,则必须从您支持的所有不同语言中解释源文件,然后在将该语言传递给编译器之前生成该语言的代码。 通过后处理,您可以简单地使用reflection来检查程序集,无论原始语言是C#,Visual Basic还是其他。

它更简单。 IL是一个比C#源代码更容易解​​析的heckofalot。 它与语言无关。