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