.NET 4.x CSharpCodeProvider. Ошибка "Невозможно найти исполняемый файл компилятора csc.exe." - C#

Узнай цену своей работы

Формулировка задачи:

Мне необходимо было написать программу, одна из задач - можно редактировать код самой же этой программы. На просторах интернета нашел (было тяжело) реализацию этого, подогнал под нужные мне параметры, то есть открывается форма "CodeEditor.cs" (открытие происходит из "Form1.cs"), в которой можно редактировать код "HtmlConverter.cs" файла (находится в сборке), а "Class1.cs" компилирует уже отредактированный код (компиляция происходит при закрытии формы CodeEditor) и подменяет уже новый "HtmlConverter.cs" в ходе работы программы, но возникает ошибка в "Class1.cs" на строке "var results = p.CompileAssemblyFromSource(ps, new[] { sourceCode });": "Невозможно найти исполняемый файл компилятора csc.exe.". Никак не могу разобраться как решить эту проблему. Помогите.... Что делать? "CodeEditor.cs":
using System.IO;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class CodeEditor : Form
    {
        private readonly string path;
        public string Source { get; set; }
        public CodeEditor(string path)
        {
            this.path = path;
            InitializeComponent();
            tbSource.Text = File.ReadAllText(path);
        }
 
        private void CodeEditor_FormClosing(object sender, FormClosingEventArgs e)
        {
            Source = tbSource.Text;
            File.WriteAllText(path, Source);
        }
    }
}
"Class1.cs":
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
 
namespace WindowsFormsApplication1
{
    internal class InProcessCompiler
    {
        internal Assembly Compile(string sourceCode, string compilerVersion = "v4.0")
        {
            CompilerParameters ps = PrepareCompileParametrs();
 
            var po = new Dictionary<string, string>
            {
                { "CompilerVersion", compilerVersion }
            };
            var p = new CSharpCodeProvider(po);
            var results = p.CompileAssemblyFromSource(ps, new[] { sourceCode });
 
            if (results.Errors.HasErrors)
            {
                var sb = new StringBuilder();
                foreach (var e in results.Errors)
                    sb.AppendLine(e.ToString());
            }
            return results.CompiledAssembly;
        }
 
        internal Type CompileAndGetType(string sourceCode, string compilerVersion = "4.0")
        {
            var ass = Compile(sourceCode, compilerVersion);
            var types = ass.GetTypes();
            if (types == null || types.Length == 0)
                throw new Exception("Compile assembly produced no types");
            else if (types.Length != 1)
                throw new Exception("Compile assembly has more than one type");
            else
                return types[0];
        }
 
        internal object compileAndInstantiate(string sourceCode, string compilerVersion = "4.0")
        {
            var mainType = CompileAndGetType(sourceCode, compilerVersion);
            return Activator.CreateInstance(mainType);
        }
 
        private CompilerParameters PrepareCompileParametrs()
        {
            var ps = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = true };
            foreach (var reference in AppDomain.CurrentDomain.GetAssemblies())
            {
                try
                {
                    ps.ReferencedAssemblies.Add(reference.Location);
                }
                catch (Exception ex)
                {
                    string s = "cannot add assembly " + reference.FullName + " " + ex.Message;
                    Debug.WriteLine(s);
                }
            }
            return ps;
        }
    }
}
"Form1.cs"
using System;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        IHtmlConverter converter = new HtmlConverter();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            tbOut.Text = converter.Converter(tbIn.Text);
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            var ce = new CodeEditor("..\\..\\HtmlConverter.cs");
            ce.ShowDialog();
            converter = (IHtmlConverter)new InProcessCompiler().compileAndInstantiate(ce.Source);
        }
    }
}

Решение задачи: «.NET 4.x CSharpCodeProvider. Ошибка "Невозможно найти исполняемый файл компилятора csc.exe."»

textual
Листинг программы
if (results.Errors.HasErrors)
            {
                var sb = new StringBuilder();
                foreach (var e in results.Errors)
                    sb.AppendLine(e.ToString());
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5
Похожие ответы