我们可以构造一个`OpCode`的实例吗?

时间:2009-08-17 00:05:53

标签: .net reflection clr opcode clr4.0

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

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

是否有任何理由无法将当前内部OpCode构造函数公开,并且文档说明用户构造的OpCode不能与ILGenerator一起使用。

编辑:这是一个例子。通过创建以下自定义操作码,我可以在一些中间指令列表之间的字节码转换中使用它,而无需创建临时局部变量。如果我发出IL,我会将剩余的swap指令转换为有效的IL表示,但在我的情况下,下一步是一个理解自定义swap指令的JIT。我正在使用Prefix2前缀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表示的引用)。

2 个答案:

答案 0 :(得分:0)

我认为不可能创建自定义OpCode实例,因为OpCode实例严格来自Common Language Infrastructure (CLI) documentation。因此,即使您的案例有意义,OpCode似乎也不是最佳选择。

答案 1 :(得分:0)