Итак, вопрос: почему декомпиляторы не восстанавливают имена локальных переменных? Я думал, что декомпилятор стирает всю информацию о локальных именах и просто использует ldarg_0 и т. д. Вот почему этот код:
private static int Foo()
{
int locA = Console.ReadKey().KeyChar;
int b = Console.ReadKey().KeyChar;
int c = Console.ReadKey().KeyChar;
return locA*b * c;
}
декомпилируется в этот:
private static int Foo() // from .Net reflector 8.2
{
int keyChar = Console.ReadKey().KeyChar;
int num2 = Console.ReadKey().KeyChar;
int num3 = Console.ReadKey().KeyChar;
return ((keyChar * num2) * num3);
}
Это было ясно до сегодняшнего дня, когда я нашел декомпилятор ILSpy, и он декомпилировал его вот так:
// ConsoleApplication101.Program
private static int Foo()
{
int locA = (int)Console.ReadKey().KeyChar;
int b = (int)Console.ReadKey().KeyChar;
int c = (int)Console.ReadKey().KeyChar;
return locA * b * c;
}
так что оригинальный код — вот он! (я знаю, что я запретил компилятору оптимизировать мой код, но меня это не волнует)
вопрос: почему все используемые декомпиляторы (reflector, dotPeek и т. д.) этого не делают Я не буду показывать эту чрезвычайно важную информацию, когда компилятор предоставляет ее в exe!
.method private hidebysig static int32 Foo() cil managed
{
// Размер кода: 56 (0x38)
.maxstack 2
.locals init ([0] int32 locA,
[1] int32 b,
[2] int32 c,
[3] int32 CS$1$0000,
[4] valuetype [mscorlib]System.ConsoleKeyInfo CS$0$0001)
IL_0000: nop
IL_0001: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0006: stloc.s CS$0$0001
IL_0008: ldloca.s CS$0$0001
IL_000a: call instance char [mscorlib]System.ConsoleKeyInfo::get_KeyChar()
IL_000f: stloc.0
IL_0010: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0015: stloc.s CS$0$0001
IL_0017: ldloca.s CS$0$0001
IL_0019: call instance char [mscorlib]System.ConsoleKeyInfo::get_KeyChar()
IL_001e: stloc.1
IL_001f: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_0024: stloc.s CS$0$0001
IL_0026: ldloca.s CS$0$0001
IL_0028: call instance char [mscorlib]System.ConsoleKeyInfo::get_KeyChar()
IL_002d: stloc.2
IL_002e: ldloc.0
IL_002f: ldloc.1
IL_0030: mul
IL_0031: ldloc.2
IL_0032: mul
IL_0033: stloc.3
IL_0034: br.s IL_0036
IL_0036: ldloc.3
IL_0037: ret
} // end of method Program::Foo
Подробнее здесь: https://stackoverflow.com/questions/215 ... mes-in-net