Динамически заменять содержимое метода C#?C#

Место общения программистов C#
Ответить
Anonymous
 Динамически заменять содержимое метода C#?

Сообщение Anonymous »

Я хочу изменить способ выполнения метода C# при его вызове, чтобы можно было написать что-то вроде этого:

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

[Distributed]
public DTask Solve(int n, DEvent callback)
{
for (int m = 2; m < n - 1; m += 1)
if (m % n == 0)
return false;
return true;
}
Во время выполнения мне нужно иметь возможность анализировать методы, имеющие атрибут Distributed (что я уже умею), а затем вставлять код перед выполнением тела функции и после ее возврата. Что еще более важно, мне нужно иметь возможность сделать это, не изменяя код, в котором вызывается Solve, или в начале функции (во время компиляции; цель - сделать это во время выполнения).

На данный момент я попробовал этот фрагмент кода (предположим, что t — это тип, в котором хранится Solve, а m — это информация о методе Solve):

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

private void WrapMethod(Type t, MethodInfo m)
{
// Generate ILasm for delegate.
byte[] il = typeof(Dpm).GetMethod("ReplacedSolve").GetMethodBody().GetILAsByteArray();

// Pin the bytes in the garbage collection.
GCHandle h = GCHandle.Alloc((object)il, GCHandleType.Pinned);
IntPtr addr = h.AddrOfPinnedObject();
int size = il.Length;

// Swap the method.
MethodRental.SwapMethodBody(t, m.MetadataToken, addr, size, MethodRental.JitImmediate);
}

public DTask ReplacedSolve(int n, DEvent callback)
{
Console.WriteLine("This was executed instead!");
return true;
}
Однако MethodRental.SwapMethodBody работает только с динамическими модулями; а не те, которые уже были скомпилированы и сохранены в сборке.

Поэтому я ищу способ эффективно выполнить SwapMethodBody для метода, который уже сохранен в загруженной и исполняемой сборке.

Обратите внимание: это не проблема, если мне придется полностью скопировать метод в динамический модуль, но в этом случае мне нужно найти способ копирования через IL, а также обновить все вызовы Solve() так, чтобы они указывали на новую копию.

Подробнее здесь: https://stackoverflow.com/questions/729 ... arp-method
Ответить

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

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

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

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

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