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

时间:2010-02-05 21:55:40

标签: c# macros c-preprocessor aop postsharp

所以我们都知道C#没有类似C的宏预处理器(并且有一个很好的线程来解释为什么here)。但是现在AOP正在获得牵引力,似乎我们开始使用后处理器(我们曾经使用预处理器)做的事情(请记住,我只是在PostSharp弄湿了所以我可能不在基地。)

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

4 个答案:

答案 0 :(得分:6)

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

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

    -gael

答案 1 :(得分:4)

从技术上讲,Visual Studio中内置了一个预编译选项:Text Template Transformation Toolkit (T4)。这使您可以在预编译步骤中完成相当惊人的事情,并且是很多产品的基础,例如一些ORM等。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

相关问题