.NET Framework 4.0 为反射 API 引入了几个项目,这些项目从非常有用到对我的工作至关重要。其中包括Assembly
、Module
、MethodBody
和LocalVariableInfo
以及新CustomAttributeData
类的受保护构造函数。我仍然需要一些很难解决的项目。我相信它们很容易适用于需要扩展我刚刚列出的类型的同一 [小] 群体。
这一次:我正在寻找一种方法来System.Reflection.Emit.OpCode
用我自己的参数构造一个结构实例。我目前调用内部构造函数来创建实例。这对性能没有不利影响,因为我将构建的项目公开为public static readonly
类的成员以供重用,但正如您可以想象的那样,这是一个非常次优的场景。
是否有任何理由无法通过OpCode
说明用户构造OpCode
的 s 不能与ILGenerator
.
编辑:这是一个例子。通过创建以下自定义操作码,我可以在一些中间指令列表之间的字节码转换中使用它,而无需创建临时局部变量。如果我发出 IL,我会将剩余的swap
指令转换为有效的 IL 表示,但在我的情况下,下一步是理解自定义swap
指令的 JIT。我正在使用Prefix2
prefix 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
表示的引用)。