Как получить результат компиляции?

181
17 мая 2018, 10:40

Делаю 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. Хотелось бы получить источник ошибки.

Answer 1

Нет необходимости вызывать компилятор напрямую, для этого есть встроенный 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("Компиляция завершена успешно!");
        }      
    }        
}
Answer 2

Можно в Console.SetOut задать новый поток вывода и читать его в своей программе, анализируя вывод консоли.

Правда все таки лучше использовать API, как советуют ниже.

READ ALSO
Переадресация при 404 asp mvc

Переадресация при 404 asp mvc

Как сделать, что бы при неверном url происходила переадресация на главную страницу ? Я пытаюсь реализовать это добавлением в webconfig :

238
Убрать рамку с groupbox c#

Убрать рамку с groupbox c#

Надо полностью убрать рамку с groupboxЧтоб остались только элементы внутри

522
C# парсинг html-страницы с помощью AngleSharp

C# парсинг html-страницы с помощью AngleSharp

Подскажите литературу на русском языке по парсингу html с помощью AngleSharp?

228