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’и необходимо добавлять только так, иначе при компиляции программа не сможет их найти
Вот вообщем-то и все, остальное я думаю и так понятно. Результат:
Как создать скриншот? | Как создать лог файл HijackThis? Причины, по которым может тормозить компьютер | Правила сайта!
|
|
| |