Простейший компилятор на C#
Создавать программы мы умеем, теперь пришло время перейти на новый уровень: научить нашу программу создавать приложения. Для чего это может понадобиться? В одном из последних проектов мне потребовалось создать каталог. Каталог товаров для рыб, аквариумов. По сути дела этот каталог – это некая база данных, что-то типа презентации. Сравнить его можно с сайтом – активное взаимодействие с пользователем, мультимедиа.
Такой каталог сделать не так уж и сложно: подключаем базу данных (SQLite), создаем в ней таблицы, рисуем интерфейс + некоторые визуальные эффекты. Вот что у нас получилось:
Однако, у заказчика планы более грандиозные. Ему необходимо было разработать программу, которая бы могла сама создавать данные каталоги. То есть создаем каталог и экспортируем его в формат exe. Ну что ж, надо, значит сделаем. Для начала давайте научимся компилировать простейшие программы.
Исходный код самого простого компилятора:
using Microsoft.CSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.CodeDom.Compiler; using System.IO; namespace Compl { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string source = ""; try { using (StreamReader sr = new StreamReader(@"D:\Rabota\Compl\Catalog.cs")) { string line; while ((line = sr.ReadLine()) != null) { source += line + "\n"; } } } catch (Exception ee) { MessageBox.Show(ee.Message, "Файл не может быть прочитан"); } // Настройки компиляции Dictionary<string, string> providerOptions = new Dictionary<string, string>(); providerOptions.Add("CompilerVersion", "v4.0"); CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); CompilerParameters compilerParams = new CompilerParameters(); compilerParams.OutputAssembly = "D:\\Rabota\\Compl\\Catalog.exe"; compilerParams.GenerateExecutable = true; compilerParams.ReferencedAssemblies.Add("System.Drawing.dll"); compilerParams.ReferencedAssemblies.Add("System.dll"); compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll"); // Компиляция CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source); foreach (CompilerError err in results.Errors) { MessageBox.Show(err.ErrorText); } if (results.Errors!=null) { MessageBox.Show("Успешно!"); } } private void Form1_Load(object sender, EventArgs e) { } } }На самом деле ничего сложного тут нет – пользуемся встроенными возможностями студии. Читаем файл построчно и пытаемся его обработать встроенным компилятором. Добавляем ссылки на библиотеки, если есть такая необходимость – а у нас есть, так как будем создавать оконное приложение.
А вот и сам компилируемый файл:
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; using System.Reflection; [assembly: AssemblyTitle("Каталог")] namespace Catalog { public class Form1 : Form { [DllImport("user32.dll")] static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_HIDE = 0; public Button button1; public Form1() { this.Text = "Каталог"; button1 = new Button(); button1.Size = new Size(80, 40); button1.Location = new Point(30, 30); button1.Text = "Нажми меня!"; this.Controls.Add(button1); button1.Click += new EventHandler(button1_Click); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Молодец!"); } [STAThread] static void Main() { IntPtr windowHandle = Process.GetCurrentProcess().MainWindowHandle; ShowWindow(windowHandle, SW_HIDE); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }Тут тоже ничего особенного – создаем форму, на ней кнопку и обрабатываем. Небольшой интерес вызывает только скрытие консоли. Результат:
И вот мы написали простейший компилятор, который работает с файлами C#.
Если вам требуется помощь по C# или необходимо создать программу, то вы всегда можете обратиться ко мне – за небольшую плату я вам с удовольствием помогу. Пишите!
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.