ILGenerator 是否有一个好的包装器?
我现在使用 System.Reflection.Emit 一段时间了,发现它(谁不这样做?)就像容易出现错误一样痛苦。
您知道 IL 生成器是否有一个好的包装器,我可以依靠它以比直接使用 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 个幼稚的示例,但它足以证明我的期望。 我们可以将其视为一组扩展方法,但最好支持条件语句和循环,例如 RunSharp。 事实上,RunSharp 非常接近我想要的,但它对 ILGenerator 进行了过多的抽象,并且没有公开其所有功能。
我不记得在哪里了,但我已经在一个开源项目中看到过这样的助手。
I'm using System.Reflection.Emit for a while now, and find it (who don't?) as painful as bug prone.
Do you know if there is a good wrapper around the IL Generator, something that I can rely on to emit IL in a more safe and easier manner than with playing directly with SRE?
Edit:
I know that manipulating expression trees is definitively easier and safer than emitting IL directly, but they also have some constraints right now. I can't create code blocs, use loops, declare and work with several locals, etc. We need to wait until .NET 4 comes out :)
Moreover, I'm dealing with a code base which already relies on SRE.
Obviously, ILGenerator do everything I need. But I would appreciate more assistance when manipulating it. When I'm referring to a ILGenerator wrapper, which remains at a pretty low level, I think about something which could provide methods like:
// 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)
It's really 3 naive examples, but it could be enough to demonstrate what I expect. We can see that as a set of extension methods, but it could be nice to have support for conditional statements and loops like in RunSharp. In fact, RunSharp is pretty close that what I want, but it abstracts the ILGenerator too much and doesn't expose all its functionality.
I can't remember where, but I already saw such an helper in an open source project.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您使用 .NET 3.5,您可能会发现使用表达式树更为合理。 这完全取决于你在做什么——而且它仍然可能非常痛苦——但这肯定是另一个需要注意的选择。
If you're using .NET 3.5, you may find using Expression Trees to be more reasonable. It entirely depends on what you're doing - and it can still be quite painful - but it's certainly another option to be aware of.
[更新]:我想到了这个名字 ;-p RunSharp。 我不能保证它,但它可能正是你所需要的。
然而; 你需要生成什么? CodeDom 是一种选择。 对于创建方法,您可能会发现使用 Expression 类(通过 Expression.Lambda/Compile 将其编译为类型化委托后)。
[updated]: I thought of the name ;-p RunSharp. I can't vouch for it, but it might be what you need.
However; what do you need to generate? CodeDom is one option. For creating methods, you might find that you can do a lot more than you expect with the Expression class in .NET 3.5 (after compiling it to a typed delegate via Expression.Lambda/Compile.
尝试使用 Mono.Cecil
Try using Mono.Cecil