.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());
}