.NET Framework 4.0向Reflection API引入了几个项目,其范围从非常有用到对我的工作至关重要。其中包括Assembly
,Module
,MethodBody
和LocalVariableInfo
以及新的CustomAttributeData
类别的受保护构造函数。有一些项目我仍然需要解决相当麻烦的问题。我相信他们很容易适用于相同的[小型]人群,因此需要扩展我刚刚列出的类型。我们可以构建一个`OpCode`的实例吗?
这次:我正在寻找一种方法来构建我自己的参数System.Reflection.Emit.OpCode
结构的实例。我目前调用内部构造函数来创建实例。这对性能没有任何不利影响,因为我将构造的项目公开为类的public static readonly
成员以供重用,但正如您可以想象的那样,这是非常不理想的场景。
有什么原因,它是不可能的,以与文档的当前内部OpCode
构造公众,指出用户构建OpCode
s不能与ILGenerator
使用。
编辑:下面是一个例子。通过创建下面的自定义操作码,我可以在一些中间指令列表之间的字节码转换中使用它,而不需要创建临时局部变量。如果我发射IL,我会将其余的swap
指令转换为有效的IL表示,但在我的情况下,下一步是理解自定义指令的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
表示的引用)。
你的意思是http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx自1.0以来一直存在? – 2009-08-17 00:18:27
是的,就是那个。 – 2009-08-17 01:02:49