Итак, вопрос: почему декомпиляторы не восстанавливают имена локальных переменных? Я думал, что декомпилятор стирает всю информацию о локальных именах и просто использует 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
Восстановление локальных имен в .Net ⇐ C#
Место общения программистов C#
1731154732
Anonymous
Итак, вопрос: почему декомпиляторы не восстанавливают имена локальных переменных? Я думал, что декомпилятор стирает всю информацию о локальных именах и просто использует 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
Подробнее здесь: [url]https://stackoverflow.com/questions/21511880/recovery-of-local-names-in-net[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия