Вытаскиваем исходник C# из exe-файла
Рабочие компьютеры у меня меняются не так уж редко. И далеко не всегда переносится вся информация. Что-то кажется ненужным сейчас, но может понадобится в дальнейшем или просто интересно вспомнить. Так и произошло с программой «Запомни домино». На днях я просматривал исходники и не обнаружил её – и на самом деле, писал пару лет назад, все потерялось. Что ж, так как я никак не шифровал exe и знаю, на чем написано (C# Net 4.0) и нет нативного кода, то попробуем вытащить исходник.
Для этого мы воспользуемся программой .NET Reflector 8. По сути это очень хороший декомпилятор. Открываем с помощью её наш экзешник и видим кучу непонятного. Не стоит пугаться, все на самом деле очень просто. В самом низу левой панели наш открывшийся файл: пару кликов по дереву и оппа – мы открываем нашу Form1!
Правда, здесь пока только перечисление полей, но это уже что-то. Так как программа простенькая, то нам надо только найти обработчики кнопок. Кнопки всего две, немного поискав находи обработчик для первой:
private void button2_Click(object sender, EventArgs e) { int num; int num2; this.timer1.Interval = ((int) this.numericUpDown3.Value) * 0x3e8; this.labelEnd.Visible = false; this.numericUpDown2.Visible = false; this.numericUpDown3.Visible = false; this.labelChisloDomino.Visible = false; this.label1.Visible = false; this.label2.Visible = false; this.label3.Visible = false; this.label4.Visible = false; this.label5.Visible = false; Random random = new Random(); do { num = random.Next(0, 7); num2 = random.Next(0, 7); } while (num2 < num); Image image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" })); this.sum = num + num2; this.label1.Image = image; this.chisloDomino = (int) this.numericUpDown2.Value; if (this.chisloDomino > 1) { do { num = random.Next(0, 7); num2 = random.Next(0, 7); } while (num2 < num); image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" })); this.sum = (this.sum + num) + num2; this.label2.Image = image; this.label2.Visible = true; } if (this.chisloDomino > 2) { do { num = random.Next(0, 7); num2 = random.Next(0, 7); } while (num2 < num); image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" })); this.sum = (this.sum + num) + num2; this.label3.Image = image; this.label3.Visible = true; } if (this.chisloDomino > 3) { do { num = random.Next(0, 7); num2 = random.Next(0, 7); } while (num2 < num); image = Image.FromFile(string.Concat(new object[] { Path.GetDirectoryName(Application.ExecutablePath), @"\img\", num, "-", num2, ".png" })); this.sum = (this.sum + num) + num2; this.label4.Image = image; this.label4.Visible = true; } this.label1.Visible = true; this.button2.Visible = false; this.timer1.Start(); }Сложного здесь ничего нет. Берем число секунд, все делаем невидимым, затем рандомно вытаскиваем на свет божий необходимое число костяшек. Один интересный момент: почему-то я сделал не циклом и для каждой костяшки идет отдельный выбор, хотя все можно сократить. Видимо, я рассчитывал именно на три, как сейчас вспоминается и когда делал для четырех – просто добавил, не переделывая код.
И еще: в каждом выборе костяшки есть дополнительный цикл do while – чтобы первое число (верхней половины костяшки) было меньше нижней. Почему так? Смотрим в папку с изображениями: нумерация изображений сделана именно таким образом: от меньшего к большему – видимо, чтобы избежать повторения. Кстати, в программе не реализован поиск повторяющихся – но, видимо, мне этого и не надо было.
Ну и в конце запускаем таймер на нужное число секунд. Код таймер прост:
private void timer_Tick(object sender, EventArgs e) { this.count++; this.label1.Visible = false; this.label2.Visible = false; this.label3.Visible = false; this.label4.Visible = false; this.button1.Visible = true; this.numericUpDown1.Visible = true; this.timer1.Stop(); }После этого обработчик другой кнопки
private void button1_Click(object sender, EventArgs e) { this.label1.Visible = true; if (this.chisloDomino > 1) { this.label2.Visible = true; } if (this.chisloDomino > 2) { this.label3.Visible = true; } if (this.chisloDomino > 3) { this.label4.Visible = true; } this.button1.Visible = false; this.numericUpDown1.Visible = false; this.labelEnd.Visible = true; this.numericUpDown2.Visible = true; this.labelChisloDomino.Visible = true; this.numericUpDown3.Visible = true; this.label5.Visible = true; int num = (int) this.numericUpDown1.Value; if (this.sum == num) { this.labelEnd.Text = string.Concat(new object[] { "Сумма: ", this.sum, " Ваш вариант: ", num, " Верно!" }); } else { this.labelEnd.Text = string.Concat(new object[] { "Сумма: ", this.sum, " Ваш вариант: ", num, " Неправильно." }); } this.button2.Text = "Еще раз?"; this.button2.Visible = true; }Здесь тоже все просто. Сначала показываем, что нужно показать и скрываем, что ненужно. Затем сравниваем введённый пользователем результат и правильный и выводим ответ. Кстати, упражнение интересное, в реальности так рекомендуется тренировать внимание.
Ну и вот так просто мы достали исходный код из программы на C# с помощью .NET Reflector 8. Таким образом, если вам требуется помочь посмотреть исходники exe файла, то вы всегда можете написать мне. За небольшую плату я вам с удовольствием помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.