Есть ли способ выполнить массив IL-кодов в C#, таких как коды оболочки в C/C++?Выполнить код .NET IL в C#
Я хочу создать метод, преобразовать его в IL-код, обфускать его и сохранить в массиве байтов и, наконец, захочет выполнить его расшифровку содержимого массива и выполнить IL-код.
Например это мой C# код:
static int MyMethod(string A, int B)
{
B += 10;
if (A.Equals("A"))
B = 0;
return B;
}
Теперь я преобразовать его в IL код:
private static int MyMethod(string A, int B)
{
locals: int local_0,
bool local_1
/* 0000025C 00 */ nop
/* 0000025D 03 */ ldarg_1 // int B
/* 0000025E 1F 0A */ ldc_i4_s 10
/* 00000260 58 */ add
/* 00000261 10 01 */ starg_s arg_1 // int B
/* 00000263 02 */ ldarg_0 // string A
/* 00000264 72 01 00 00 70 */ ldstr "A"
/* 00000269 6F 11 00 00 0A */ callvirt System.String::Equals(string) // returns bool
/* 0000026E 16 */ ldc_i4_0
/* 0000026F FE 01 */ ceq
/* 00000271 0B */ stloc_1 // bool local_1
/* 00000272 07 */ ldloc_1 // bool local_1
/* 00000273 2D 03 */ brtrue_s loc_28
/* 00000275 16 */ ldc_i4_0
/* 00000276 10 01 */ starg_s arg_1 // int B
loc_28:
/* 00000278 03 */ ldarg_1 // int B
/* 00000279 0A */ stloc_0 // int local_0
/* 0000027A 2B 00 */ br_s loc_32
loc_32:
/* 0000027C 06 */ ldloc_0 // int local_0
/* 0000027D 2A */ ret
}
И, наконец, это байтовый массив:
private byte[] ilcode =
{
0x00, 0x03, 0x1F, 0x0A, 0x58, 0x10, 0x01, 0x02, 0x72, 0x01, 0x00, 0x00, 0x70, 0x6F, 0x11, 0x00, 0x0, 0x0A, 0x16,
0xFE, 0x01, 0x0B, 0x07, 0x2D, 0x03, 0x16, 0x10, 0x01, 0x03, 0x0A, 0x2B, 0x00, 0x06, 0x2A
};
Невозможно выполнить IL так, как вы ожидаете, но вы можете использовать отражение для загрузки и вызова любых методов в нем динамически. – Thangadurai
Я думаю, что ваша самая большая проблема - это токены метаданных. Например, токен для 'string.Equals()' ('11 00 00 0A' в вашем коде) не всегда будет одинаковым. – svick
@svick Знаки метаданных беспорядок это большое время, поскольку они, похоже, хранятся на уровне модуля (по крайней мере, это то, что я вижу из моих быстрых тестов). То же самое касается таких строк, как строковые литералы. –