c# - ILGenerator 是否有好的包装器?

标签 c# .net cil 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 并且没有公开其所有功能。

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

最佳答案

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

关于c# - ILGenerator 是否有好的包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/197005/

相关文章:

c# - Entity Framework 问题: How to handle errored column

c# - ASP.NET 站点和 SharePoint 站点有什么区别?

c# - 使用动态类型而不是不可能的通用属性

.net - 为什么这个 .NET IL 空值检查没有按预期工作?

c# - 我是否需要为 Controller 中的每个不同操作创建一个 View ?

javascript - 在 Javascript 函数中包含 Razor 格式的字符串

.net - 如果 T 是类型 arg,如何使用 Nullable<T>?

.net - 为什么自定义属性同时出现在 IL 和 Metadata 中?

.net - 为什么将 Int32 转换为 Float64 会导致数据更改?

c# - ASP.net web api 返回空对象列表