В .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
).