Простейший компилятор на 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, прикладное программирование, компиляция




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



Методы в C#
PDO и MySQLi: битва API баз данных PHP
Урок 3. Как PHP используется вместе с HTML