powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Загрузка и выполнение DynamicMethod из bytearray
1 сообщений из 1, страница 1 из 1
Загрузка и выполнение DynamicMethod из bytearray
    #38331949
qlat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Цель сохранить байт-код объекта DynamicMethod, и при следующем запуске программы загрузить и выполнить

1. Этап получение байт-кода

Пример

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
using System.Reflection;
using System.Reflection.Emit;

void f()
{
DynamicMethod d = new DynamicMethod("xxx", typeof(void), null);

ILGenerator il = d.GetILGenerator();
int idx = il.DeclareLocal(typeof(string)).LocalIndex;

il.Emit(OpCodes.Nop);
il.Emit(OpCodes.Ldstr, "Hellow world");
il.Emit(OpCodes.Stloc, idx);
il.Emit(OpCodes.Ldloc, idx);

Type[] t = new Type [1] { typeof(string) };

MethodInfo mi = typeof(Console).GetMethod("WriteLine", t );
Console.WriteLine(mi.MetadataToken.ToString());

il.Emit(OpCodes.Call, mi);
il.Emit(OpCodes.Nop);
mi = typeof(Console).GetMethod("ReadLine");
il.Emit(OpCodes.Call, mi);
il.Emit(OpCodes.Pop);
il.Emit(OpCodes.Ret);

MethodBody mb = d.GetMethodBody();
byte[] src = mb.GetILAsByteArray();

/*
var ilgen = d.GetILGenerator();
var fiBytes = il.GetType().BaseType.GetField("m_ILStream", BindingFlags.Instance | BindingFlags.NonPublic);
var fiLength = il.GetType().BaseType.GetField("m_length", BindingFlags.Instance | BindingFlags.NonPublic);
byte[] code = fiBytes.GetValue(ilgen) as byte[];
int cnt = (int)fiLength.GetValue(ilgen);
byte[] src = new byte[cnt];
Buffer.BlockCopy(code, 0, src, 0, cnt);
*/
}



На строке MethodBody mb = d.GetMethodBody();
возникает Exception — Операция является недопустимой из-за текущего состояния объекта.
Байт-код можно получить другим кодом (см. комментарии), но хочется понять, почему нельзя воспользоваться стандартным решением

2. Как скорректировать байт-код при следующем запуске, чтобы он корректно выполнялся (т.к. в байт-коде указываются фактические ссылки на методы, поля, свойства, строки, которые при новом запуске могут иметь другие адреса)?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Загрузка и выполнение DynamicMethod из bytearray
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]