.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":
"Class1.cs":
"Form1.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);
- }
- }
- }
Листинг программы
- 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;
- }
- }
- }
Листинг программы
- 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());
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д