Чисто спортивного интереса ради появилась задача: во время RunTime
подменить тело одного метода на тело другого. Собственно, задача была успешно, как показалось на первый взгляд, решена таковым образом:
public static void Inject(MethodInfo ToReplace, MethodInfo ToInject)
{
RuntimeHelpers.PrepareMethod(ToReplace.MethodHandle);
RuntimeHelpers.PrepareMethod(ToInject.MethodHandle);
unsafe
{
byte* inject = (byte*)(IntPtr.Size == 4 ? *((int*)ToInject.MethodHandle.Value.ToPointer() + 2) : *((long*)ToInject.MethodHandle.Value.ToPointer() + 1));
byte* target = (byte*)(IntPtr.Size == 4 ? *((int*)ToReplace.MethodHandle.Value.ToPointer() + 2) : *((long*)ToReplace.MethodHandle.Value.ToPointer() + 1));
int* injectSrc = (int*)(inject + 1);
int* targetSrc = (int*)(target + 1);
*targetSrc = (((int)inject + 5) + *injectSrc) - ((int)target + 5);
}
}
Подготавливаю методы для включения в область ограниченного выполнения, а после просто подменяю указатель на тело метода ToReplace
указателем на тело метода ToInject
.
Сие прекрасно работает, однако лишь в Debug-режиме, когда не применяются никакие оптимизации. Так что мой вопрос такой: какие есть еще способы подмены методов во время исполнения?
P.S. - вопрос чисто для общего развития, а не для каких-то серьезных и надежных вещей, так что самые небезопасные варианты также приветствуются)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть исходное изображение типа bmp и его необходимо нарезать на квадратыДля этого я клонирую исходное изображение с заданием новой области...
Существует список ListView в котором должны отображаться элементы вида название / время, при этом все элементы должны быть сгруппированы по времени
У меня создаются кнопки в окне cs приложения WPFЯ хочу взять одну из кнопок и заполнить ее одной буквой, но чтобы в правом верхнем еще был маленький...