Ответ 1
Я не думаю, что можно создать собственный экземпляр OpCode, поскольку экземпляры OpCode строго получены из документации по языковой инфраструктуре (CLI). Поэтому, даже если ваш случай имеет смысл, 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
).
Я не думаю, что можно создать собственный экземпляр OpCode, поскольку экземпляры OpCode строго получены из документации по языковой инфраструктуре (CLI). Поэтому, даже если ваш случай имеет смысл, OpCode, похоже, не подходит.
Почему бы вам не использовать наши собственные IL-Opcodes для промежуточных результатов, а затем преобразовать их в реальные коды операций на последнем шаге.