【问题标题】:Is there a good wrapper around ILGenerator? [closed]ILGenerator 有一个好的包装器吗? [关闭]
【发布时间】:2010-09-16 20:32:13
【问题描述】:

我现在使用 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 进行了太多抽象,并且没有公开其所有功能。

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

【问题讨论】:

  • 你还没有具体说明 ILGenerator 不做什么,以及一个“好的”包装器会做什么。
  • 这是一个有效的点;我更新了问题以提供更多详细信息。
  • 其实Expressions是lambda表达式,应该可以使用循环,实现为recursion + Y operator。
  • 你叫什么Y算子?
  • 这个问题的答案是响亮的 SIGIL! github.com/kevin-montrose/Sigil 和一个很好的样本gist.github.com/bretcope/a9dea0c5c67b0bc051c8

标签: c# .net cil ilgenerator


【解决方案1】:

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

【讨论】:

  • 不幸的是,我仍在使用 .NET 2.0。我可以使用 Expression 类的 Mono 实现,但表达式树无法处理我的目标(代码块、多个本地分配等)
  • 扩展树在实现复杂类型时没有用。仅在使用方法时。
【解决方案2】:

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

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

【讨论】:

  • 我知道 RunSharp,我一直在寻找类似的东西,它的交易水平较低。我更喜欢远离 CodeDom,即使它在很多情况下是一个很好的解决方案。我大部分时间都坚持使用 DynamicMethods。
  • 好的;次要的想法,但您可能已经在原始问题中包含了这个(以及您的 2.0 要求)......关于“较低级别” - 您正在寻找什么样的级别(在 RunSharp 和 ILGenerator 之间)?
  • 你说得对,我在原始问题中添加了更多信息。感谢您的帮助!
【解决方案3】:

尝试使用Mono.Cecil

Cecil 是 Jb Evain 编写的库 生成 并检查程序和库 ECMA CIL 格式。它有完整的 支持泛型,并支持一些 调试符号格式。

【讨论】:

    猜你喜欢
    • 2010-11-20
    • 2018-02-19
    • 2010-09-09
    • 2023-03-18
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多