Динамическое перенаправление одного метода C# на другой во время выполнения в .NET 8.C#

Место общения программистов C#
Ответить
Anonymous
 Динамическое перенаправление одного метода C# на другой во время выполнения в .NET 8.

Сообщение Anonymous »

Я использовал следующий метод для перенаправления одного метода C# в другой во время выполнения:

Код: Выделить всё

public class Injection
{

public static void install(MethodInfo methodToReplace, MethodInfo methodToInject)
{
RuntimeHelpers.PrepareMethod(methodToReplace.MethodHandle);
RuntimeHelpers.PrepareMethod(methodToInject.MethodHandle);

unsafe
{
if (IntPtr.Size == 4)
{
int* inj = (int*)methodToInject.MethodHandle.Value.ToPointer() + 2;
int* tar = (int*)methodToReplace.MethodHandle.Value.ToPointer() + 2;

//Console.WriteLine("\nVersion x86 Debug\n");
byte* injInst = (byte*)*inj;
byte* tarInst = (byte*)*tar;

int* injSrc = (int*)(injInst + 1);
int* tarSrc = (int*)(tarInst + 1);

*tarSrc = (((int)injInst + 5) + *injSrc) - ((int)tarInst + 5);
}
else
{

long* inj = (long*)methodToInject.MethodHandle.Value.ToPointer()+1;
long* tar = (long*)methodToReplace.MethodHandle.Value.ToPointer()+1;

//Console.WriteLine("\nVersion x64 Debug\n");
byte* injInst = (byte*)*inj;
byte* tarInst = (byte*)*tar;

int* injSrc = (int*)(injInst + 1);
int* tarSrc = (int*)(tarInst + 1);

*tarSrc = (((int)injInst + 5) + *injSrc) - ((int)tarInst + 5);
}
}
}
}
Код работает в .NET 6, он был скопирован из ответов на вопрос Динамически заменить содержимое метода C#? но это вызывает нарушение доступа к памяти в .NET 8: фатальная ошибка. System.AccessViolationException: попытка чтения или записи защищенной памяти. Часто это указывает на то, что другая память повреждена. Я подозреваю, что это вызвано этим критическим изменением в .NET 8: https://learn.microsoft.com/en-us/dotne ... ection.Мне нужна помощь в обновлении этого метода для .NET 8, поскольку он используется во многих местах нашей кодовой базы, и я не нашел подходящей альтернативы. Я нашел замыкание Lib.Harmony, но это не так. у меня работает.
Я пробовал изменить смещение кода (+5), используемое в текущей версии.

Подробнее здесь: https://stackoverflow.com/questions/783 ... e-in-net-8
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»