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

Простейший компилятор на 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# или необходимо создать программу, то вы всегда можете обратиться ко мне – за небольшую плату я вам с удовольствием помогу. Пишите!




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





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




Путь от бездомного до правителя
Как выиграть 100 рублей: личный опыт


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