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