.NET Framework 4.0向Reflection API引入了几个项目,从非常有用到对我的工作至关重要。其中包括Assembly
,Module
,MethodBody
和LocalVariableInfo
以及新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
表示的引用)。
答案 0 :(得分:0)
我认为不可能创建自定义OpCode实例,因为OpCode实例严格来自Common Language Infrastructure (CLI) documentation。因此,即使您的案例有意义,OpCode似乎也不是最佳选择。
答案 1 :(得分:0)