2009-08-17 173 views
3

.NET Framework 4.0向Reflection API引入了几个项目,其范围从非常有用到对我的工作至关重要。其中包括Assembly,Module,MethodBodyLocalVariableInfo以及新的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表示的引用)。

+2

你的意思是http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx自1.0以来一直存在? – 2009-08-17 00:18:27

+0

是的,就是那个。 – 2009-08-17 01:02:49

回答

0

我不认为有可能创建自定义的OpCode实例,因为OpCode实例严格来自Common Language Infrastructure (CLI) documentation。所以,即使你的情况有道理,OpCode似乎也不会成为现实。

+1

预定义的OpCode实例基于文档,但结构本身不是TR/84的一部分。我在这个应用程序中的代码是* so * clean的部分原因是我使用了反射来调用OpCode构造函数来创建新实例。对于任何执行IL的人来说,在将结果发送给ILGenerator之前,他们自己进行转换,将“特殊”操作码嵌入到中间结果中的能力可能非常有用,并且考虑到实际使用OpCode的狭窄技术用户群,开放似乎没有害处这个案例。只要让ILGenerator抛出,如果无效代码使它那么远。 – 2009-12-16 16:58:05

+1

我明白需要。也许你可以游说(在MVP的帮助下)微软公开构造函数。 – 2009-12-16 17:26:56

0

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

相关问题