我们可以构建'OpCode`的实例?(Can we construct an instanc

2019-09-24 01:27发布

在.NET Framework 4.0引入了几个项目的反射API,范围从极其有用的重要对我的工作。 在这些保护构造函数AssemblyModuleMethodBodyLocalVariableInfo和新的CustomAttributeData类。 有几个项目我仍然需要相当麻烦的解决。 我相信他们很容易地适用于同一[小]一群人将需要延长我刚刚上市的类型。

这一次,我正在寻找一种方式来构造的一个实例System.Reflection.Emit.OpCode结构用我自己的参数。 目前,我调用内部构造函数来创建实例。 因为我揭露构建项目,因为它不是有损于性能的public static readonly重用一个类的成员,但你能想象这是一个极其次优方案。

没有任何理由,不可能使目前的内部OpCode与文档构造公众,指出用户构建OpCode s不能与所使用ILGenerator

编辑:下面是一个例子。 通过创建下面的自定义操作码,我能使用它的一些指令中间列表之间的字节代码转换,而不是诉诸创建临时局部变量。 如果我是发射IL,我剩下的转换swap指令有效的IL表示,但对我来说,下一步是了解自定义一个JIT swap指令。 我使用的是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表示)。

Answer 1:

我不认为这是可以创建自定义操作代码实例,如操作代码实例从严从得到的通用语言基础结构(CLI)文档 。 所以,即使你的情况是有道理的,操作码并不似乎是要走的路。



Answer 2:

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



文章来源: Can we construct an instance of `OpCode`?