Можем ли мы построить экземпляр "OpCode"?

В .NET Framework 4.0 представлено несколько элементов API Reflection, которые варьируются от чрезвычайно полезных до жизненно важных для моей работы. Среди них - защищенные конструкторы для Assembly, Module, MethodBody и LocalVariableInfo и нового класса CustomAttributeData. Есть еще пара вещей, которые мне по-прежнему нужны, что довольно хлопотно для работы. Я считаю, что они легко применимы к одной и той же [небольшой] группе людей, которые должны были расширить типы, которые я только что перечислил.

На этот раз: Я ищу способ создания экземпляра System.Reflection.Emit.OpCode struct с моими собственными параметрами. В настоящее время я вызываю внутренний конструктор для создания экземпляров. Это не наносит вреда производительности, потому что я раскрываю построенные элементы как public static readonly членов класса для повторного использования, но, как вы можете себе представить, это крайне субоптимальный сценарий.

Есть ли какая-то причина, по которой невозможно создать существующий внутренний конструктор OpCode с документацией, которая заявляет, что пользовательский OpCode не может использоваться с 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).

Ответ 2

Почему бы вам не использовать наши собственные IL-Opcodes для промежуточных результатов, а затем преобразовать их в реальные коды операций на последнем шаге.