.NET Framework 4.0 представляет несколько элементов API Reflection, которые варьируются от чрезвычайно полезного до жизненно важного для моей работы. Среди них охраняемые конструкторы для Assembly
, Module
, MethodBody
и LocalVariableInfo
и новый класс CustomAttributeData
. Есть еще пара вещей, которые мне по-прежнему нужны, что довольно хлопотно для работы. Я считаю, что они легко применимы к той же [небольшой] группе людей, которые должны были расширить типы, которые я только что перечислил.Можем ли мы построить экземпляр `OpCode`?
На этот раз: Я ищу способ построить экземпляр структуры 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
).
Вы имеете в виду http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcode.aspx, который существует с 1.0? –
Да, это тот. –