ILGenerator周围有一个很好的包装器吗?

我现在使用System.Reflection.Emit一段时间了,发现它(谁没有?)像容易出错一样痛苦。

你知道IL Generator周围是否有一个好的包装器,我可以依赖它以比直接使用SRE更安全,更容易的方式发出IL吗?

编辑:

我知道操纵表达树比直接发射IL更容易和更安全,但它们现在也有一些限制。 我不能创建代码块,使用循环,声明和使用几个本地,等等。我们需要等到.NET 4出来:)

而且,我正在处理一个已经依赖于SRE的代码库。

显然,ILGenerator会做我需要的一切。 但是在操纵它时我会感激更多的帮助。 当我指的是ILGenerator包装器时,它仍处于相当低的水平,我想到的东西可以提供如下方法:

// Performs a virtual or direct call on the method, depending if it is a // virtual or a static one. Call(MethodInfo methodInfo) // Pushes the default value of the type on the stack, then emit // the Ret opcode. ReturnDefault(Type type) // Test the object type to emit the corresponding push // opcode (Ldstr, Ldc_I*, Ldc_R*, etc.) LoadConstant(object o) 

这真的是3个天真的例子,但它足以certificate我的期望。 我们可以看到它是一组扩展方法,但是对于像RunSharp这样的条件语句和循环的支持可能会很好。 实际上,RunSharp与我想要的非常接近,但它过多地抽象了ILGenerator并且没有公开它的所有function。

我不记得在哪里,但我已经在开源项目中看到了这样的帮助。

如果您使用的是.NET 3.5,则可能会发现使用表达式树更合理。 这完全取决于你正在做什么 – 它仍然可能非常痛苦 – 但它肯定是另一个需要注意的选择。

[更新]:我想到了名字;-p RunSharp 。 我不能保证它,但它可能是你需要的。

然而; 你需要产生什么? CodeDom是一种选择。 对于创建方法,您可能会发现在.NET 3.5中使用Expression类可以做很多事情(在通过Expression.Lambda / Compile将其编译为类型化委托之后)。

尝试使用Mono.Cecil

Cecil是由Jb Evain编写的一个库,用于生成和检查ECMA CIL格式的程序和库。 它完全支持generics,并支持一些调试符号格式。