[ Войти · Правила форума · Поиск · RSS ]

  • Страница 1 из 1
  • 1
Пишем билдер на C#
AnymousДата: Четверг, 16.01.2014, 01:03 | Сообщение # 1
.::Создатель::.
Сообщений: 863
Репутация: 53 ±
Награды: 24 +
В этой статье я расскажу, как написать билдер своего софта на C#.
Компилировать будем простейшую форму, у которой будет динамически меняться Caption (текст заголовка).

Для компилирования используются Namespacы:
Microsoft.CSharp
System.CodeDom.Compiler

В них содержатся необходимые нам инструменты, например такие, как CSharpCodeProvider. Эта штука позволяет компилировать нам код из строки с помощью метода CompileAssemblyFromSource(). Этим мы и воспользуемся.
Хранить свой код мы будем в самом приложении, чтобы не раздавать сорцы. Так как C# — JIT-язык, то после создания билдера его надо хорошо закриптовать, инструментов для этого куча, в гугле все есть, защиту .NET я описывать в этой статье не буду.

Итак, создаем проект WinForms. Так как у меня будет пустая форма, то ничего добавлять я не стану.
Теперь важно: весь код необходимо перенести в один файл. Все классы, Program.cs, Form1.Designer.Cs и т.д.
Это можно сделать простым копипастом и переносом using’ов вверх. Объединив все, я получил:
Доступно только для пользователей
Сохраняем это в .txt файл, создаем новый проект — наш компилятор. В его ресурсы добавляем .txt файл.
Меняем необходимый динамический текст на какой-нибудь другой, у меня это %_form_caption_%
Т.е. в ресурсах строчку this.Text = "Form1"; надо поменять на this.Text = "%_form_caption_%";

Важный момент: в настройках ресурса необходимо поставить эту настройку, иначе мы не сможем ее прочитать. Я долго искал ошибку, пока случайно не наткнулся на данное свойство.

Теперь дизайним нашу форму как хотим, ставим textbox и button.
Обработчик нажатия кнопки:
Доступно только для пользователей
Давайте разберем этот код.
Начнем со строчки:
using (Stream stream = Assembly.GetExecutingAssembly()
.GetManifestResourceStream("builder.Resources.res.txt"))
Она создает поток данных, в котором находится содержимое нашего файла с исходниками.
Важно: builder — необходимо поменять на namespace нашего компилятора
res.txt — на имя вашего ресурса (.txt файла).

Далее
string result = reader.ReadToEnd().Replace("%_form_caption_%", textBox1.Text.Replace("\"", "\\\""));

В этой строчке происходит формирование новых значений, замена статического %_form_caption_% на динамический textBox1.Text. Обратите внимание на Replace("\"", "\\\"") — это экранирование кавычек. Если пользователь введет что-то, содержащее кавычки, например Hello, "user", то в новом исходнике он будет выглядеть как this.Text = "Hello, "user"" и это вызовет синтаксическую ошибку.

Дальше идет копипаст с MSDN, его нет смысла объяснять. Обращу внимание только на следующие строчки:
CompilerOptions = "/t:winexe" — так как мы генерируем не консольное, а WinForms приложение, то необходимо указать это компилятору напрямую. В противном случае на программе из выхода мы получим консольное приложение, поверх которого запустится наше. Params.ReferencedAssemblies.Add("System.Windows.Forms.dll");
Params.ReferencedAssemblies.Add("System.dll"); Params.ReferencedAssemblies.Add("System.Drawing.dll"); — Все using’и необходимо добавлять только так, иначе при компиляции программа не сможет их найти

Вот вообщем-то и все, остальное я думаю и так понятно.
Результат:

Прикрепления: 9424586.png (4.5 Kb) · 8367122.png (6.9 Kb) · 3260657.png (19.4 Kb)

Как создать скриншот? | Как создать лог файл HijackThis?
Причины, по которым может тормозить компьютер | Правила сайта!
 
  • Страница 1 из 1
  • 1
Поиск:


Чтобы добавить сообщение или создать новую тему, необходимо зарегистрироваться или зайти под своим ником!
вверх
Файлы для обмена предоставлены пользователями сайта. Администрация не несёт ответственности за их содержание. На сервере хранятся только торрент-файлы. Это значит, что мы не храним никаких нелегальных материалов, а так же материалов охраняемых авторским правом.
RudSOFT © 2010 - 2024 | Карта сайта | Карта форума | Хостинг от uCoz Cвязь с Администрацией | Информация для правообладателей