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