3

.NET Framework 4.0 为反射 API 引入了几个项目,这些项目从非常有用到对我的工作至关重要。其中包括AssemblyModuleMethodBodyLocalVariableInfo以及新CustomAttributeData类的受保护构造函数。我仍然需要一些很难解决的项目。我相信它们很容易适用于需要扩展我刚刚列出的类型的同一 [小] 群体。

这一次:我正在寻找一种方法来System.Reflection.Emit.OpCode用我自己的参数构造一个结构实例。我目前调用内部构造函数来创建实例。这对性能没有不利影响,因为我将构建的项目公开为public static readonly类的成员以供重用,但正如您可以想象的那样,这是一个非常次优的场景。

是否有任何理由无法通过OpCode说明用户构造OpCode的 s 不能与ILGenerator.

编辑:这是一个例子。通过创建以下自定义操作码,我可以在一些中间指令列表之间的字节码转换中使用它,而无需创建临时局部变量。如果我发出 IL,我会将剩余的swap指令转换为有效的 IL 表示,但在我的情况下,下一步是理解自定义swap指令的 JIT。我正在使用Prefix2prefix 0xFD,它被任何有效的 IL 操作码保留和使用。

/// <summary>
/// Swaps adjacent elements on the evaluation stack. The supplied inline int32 argument gives the
/// index of the topmost item in the pair.
/// </summary>
public static readonly OpCode Swap;

我还将将此用于没有简单/通用托管代码表示但在各种本机代码生成器中可用的简单平台相关表示的 JIT 内在函数。其中之一是ldthread(加载对当前托管线程RuntimeThread表示的引用)。

4

2 回答 2

0

我认为不可能创建自定义 OpCode 实例,因为 OpCode 实例严格派生自Common Language Infrastructure (CLI) 文档。因此,即使您的案例有意义,OpCode 似乎也不是要走的路。

于 2009-12-16T09:16:39.307 回答
0

为什么不使用我们自己的 IL-Opcodes 作为中间结果,然后在最后一步将它们转换为真正的操作码。

于 2010-07-26T15:56:17.473 回答