IKVM.Reflection.Emit 和 Mono.Cecil 之间的区别

Difference between IKVM.Reflection.Emit and Mono.Cecil

IKVM.Reflection.Emit 有 "the ability to read and emit .NET 1.1, .NET 2.0 and .NET 4.0 assemblies (while running on, for example, .NET 2.0).".

Mono.Cecil有相同的吗?对于这个用例,它们可以互换吗?他们现在都支持吗?它们之间的主要区别是什么(在发射 IL 方面)?

我知道这是一个老问题,但我想提供一个答案。 IKVM.Reflection.Emit API 是在其作者厌倦了 System.Reflection.EmitCecil.Reflection.Emit 时发明的。为了让IKVMC编译器更快,他从零开始设计这个新的API.

历史可以从以下博文中找到,

2008 Aug Switch from Microsoft .NET reflection to Cecil

2008 Nov Switch from Cecil to IKVM.Reflection.Emit

2010 Jan Announce IKVM.Reflection

所以一般来说 IKVM.Reflection 和 Cecil 具有相似的功能,并且 IKVM.Reflection API 在很多方面应该更快。

到现在你仍然可以看到Cecil在很多实用程序中被广泛使用(比如Obfuscar,我正在维护的一个混淆工具)。 IKVM.Reflection主要用在Mono C#编译器和IKVM本身,不知道有没有其他项目在用(但应该很多)。