.NET: динамическое клонирование существующего метода с помощью Reflection.Emit - PullRequest
1 голос
/ 05 сентября 2010

Существует множество потоков о том, как создать метод с использованием Reflection.Emit, но я не могу найти ни одного по клонированию или копированию существующего метода.

Я хотел бы скопировать существующий класс и добавить в него еще несколько дополнительных полей. У меня проблемы с копированием методов. Я читал, что вы не можете просто взять код IL из тела, потому что токены относятся к существующему модулю. Можно ли клонировать или скопировать метод класса другого класса, используя MethodBuilder?

Ответы [ 2 ]

4 голосов
/ 05 сентября 2010

Ну, это возможно, но довольно неловко. Проблема в том, что класс MethodBody позволяет вам получать только IL в виде массива байтов. Однако метод ILGenerator.Emit () не перегружен, чтобы просто скопировать эти байты в динамический метод. Требуется использовать правильную перегрузку для генерации правильной инструкции IL.

Это важно не только для того, чтобы всегда генерировать правильный IL, но и для сбора информации о динамическом методе. В частности, размер стека, который требуется для метода. Единственный способ использовать ILGenerator.Emit () - это написать код, который сначала декомпилирует байты в соответствующие им инструкции IL. Это не невозможно, просто много работы. Я не могу думать о сокращении.

0 голосов
/ 05 сентября 2010

Посмотрите на PostSharp и основную технологию.

...