Делаю ide для языка C# на WinForms. При запуске отправляю файлу csc.exe исходники и путь где должен лежать будущий exe. Все работает, но как мне перехватить ошибку при неудачной компиляции?
Код того как я компилирую:
new Process() {
StartInfo = {
FileName=@"C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe",
Arguments=@"-out:" + SelectedFile.FullName + @".exe " + SelectedFile.FullName
}
}.Start();
код того как запускаю:
Process.Start(new DirectoryInfo(PathToFolderWithFiles).GetFiles(@"*.exe")
.Where(a => a.Name.Split('.')[0] == SelectedFile.Name.Split('.')[0])
.Single().FullName);
При неуспешной компиляции не создается файл exe. Хотелось бы получить источник ошибки.
Нет необходимости вызывать компилятор напрямую, для этого есть встроенный API (System.CodeDom.Compiler). Ошибки можно получить через свойство CompilerResults.Errors:
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
namespace WindowsFormsTest1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
var csc = new CSharpCodeProvider();
string filepath = "c:\\test\\Hello.cs";
var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "c:\\test\\Hello.exe", true);
parameters.GenerateExecutable = true;
CompilerResults results = csc.CompileAssemblyFromFile(parameters, new string[]{filepath});
if (results.Errors.Count > 0)
{
textBox1.Text = "Errors: " + Environment.NewLine;
foreach (var err in results.Errors)
{
textBox1.Text += err.ToString() + Environment.NewLine;
}
return;
}
else MessageBox.Show("Компиляция завершена успешно!");
}
}
}
Можно в Console.SetOut задать новый поток вывода и читать его в своей программе, анализируя вывод консоли.
Правда все таки лучше использовать API, как советуют ниже.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости