На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Вытаскиваем исходник 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 файла, то вы всегда можете написать мне. За небольшую плату я вам с удовольствием помогу.






тегистатьи IT, .NET Reflector, декомпиляция





Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Стек Java
Java: вывод слов с тремя цифрами


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.