Название более или менее говорит обо всем. На основании this статьи, я придумал это:Как внедрить IL в метод во время выполнения
public static unsafe void Replace(this MethodBase destination, MethodBase source)
{
IntPtr srcHandle = source.MethodHandle.GetFunctionPointer();
IntPtr dstHandle = destination.MethodHandle.GetFunctionPointer();
int* dstPtr = (int*)dstHandle.ToPointer();
*dstPtr = srcHandle.ToInt32();
}
Это на самом деле работает ... иногда -.-
Например, это работает.
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void A()
{
Console.WriteLine("Hai World");
}
public static void B()
{
Console.WriteLine("Bai World");
}
}
Однако, это не (SEHException). Все, что я сделал, это изменить порядок, в котором функции были определены.
public static class Program
{
public static void Main(string[] args)
{
MethodInfo methodA = typeof(Program).GetMethod("A", BindingFlags.Public | BindingFlags.Static);
MethodInfo methodB = typeof(Program).GetMethod("B", BindingFlags.Public | BindingFlags.Static);
methodA.Replace(methodB);
A();
B();
}
public static void B()
{
Console.WriteLine("Bai World");
}
public static void A()
{
Console.WriteLine("Hai World");
}
}
Что касается кода в статье ... Я не мог заставить его работать вообще.
Любые идеи/альтернативы?
Зачем вы хотите это сделать? Это звучит как ужасная идея. – Amy
Не волнуйся - ничего злонамеренного. Просто ради знания: D – YellPika
Я считаю, что единственный безопасный способ сделать это - ввести код перед загрузкой сборки. – porges