Tiêu đề nhiều hay ít nói lên tất cả. Dựa trên this bài viết, tôi đã đi lên với điều này:Làm thế nào để tiêm IL vào một phương pháp tại thời gian chạy
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();
}
này thực sự hoạt động ... thỉnh thoảng -.-
Ví dụ, các công trình này.
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");
}
}
Tuy nhiên, điều này không (SEHException). Tất cả những gì tôi đã làm là thay đổi thứ tự các hàm được định nghĩa.
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");
}
}
Đối với mã trong bài viết ... Tôi không thể làm việc đó được.
Bất kỳ ý tưởng/lựa chọn thay thế nào?
Tại sao bạn muốn thực hiện việc này? Điều này nghe có vẻ như một ý tưởng khủng khiếp. – Amy
Đừng lo lắng - không có gì độc hại. Chỉ vì lợi ích của kiến thức: D – YellPika
Tôi tin rằng cách an toàn duy nhất để làm điều này là tiêm mã trước khi lắp ráp được nạp. – porges