Подмена метода во время RunTime

242
12 июля 2018, 18:00

Чисто спортивного интереса ради появилась задача: во время 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. - вопрос чисто для общего развития, а не для каких-то серьезных и надежных вещей, так что самые небезопасные варианты также приветствуются)

READ ALSO
Что такое OwinContext ? Asp.Net core 2.0 Identity

Что такое OwinContext ? Asp.Net core 2.0 Identity

пытаюсь создать RoleManager

182
Верхний левый угол изображения c#?

Верхний левый угол изображения c#?

Есть исходное изображение типа bmp и его необходимо нарезать на квадратыДля этого я клонирую исходное изображение с заданием новой области...

150
Группировка элементов в ListView

Группировка элементов в ListView

Существует список ListView в котором должны отображаться элементы вида название / время, при этом все элементы должны быть сгруппированы по времени

198
Как заполнить button grid'ом из кода и заполнить его textblock'ами?

Как заполнить button grid'ом из кода и заполнить его textblock'ами?

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

221