.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":
Листинг программы
  1. using System.IO;
  2. using System.Windows.Forms;
  3. namespace WindowsFormsApplication1
  4. {
  5. public partial class CodeEditor : Form
  6. {
  7. private readonly string path;
  8. public string Source { get; set; }
  9. public CodeEditor(string path)
  10. {
  11. this.path = path;
  12. InitializeComponent();
  13. tbSource.Text = File.ReadAllText(path);
  14. }
  15. private void CodeEditor_FormClosing(object sender, FormClosingEventArgs e)
  16. {
  17. Source = tbSource.Text;
  18. File.WriteAllText(path, Source);
  19. }
  20. }
  21. }
"Class1.cs":
Листинг программы
  1. using System;
  2. using System.CodeDom.Compiler;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Reflection;
  6. using System.Text;
  7. using Microsoft.CSharp;
  8. namespace WindowsFormsApplication1
  9. {
  10. internal class InProcessCompiler
  11. {
  12. internal Assembly Compile(string sourceCode, string compilerVersion = "v4.0")
  13. {
  14. CompilerParameters ps = PrepareCompileParametrs();
  15. var po = new Dictionary<string, string>
  16. {
  17. { "CompilerVersion", compilerVersion }
  18. };
  19. var p = new CSharpCodeProvider(po);
  20. var results = p.CompileAssemblyFromSource(ps, new[] { sourceCode });
  21. if (results.Errors.HasErrors)
  22. {
  23. var sb = new StringBuilder();
  24. foreach (var e in results.Errors)
  25. sb.AppendLine(e.ToString());
  26. }
  27. return results.CompiledAssembly;
  28. }
  29. internal Type CompileAndGetType(string sourceCode, string compilerVersion = "4.0")
  30. {
  31. var ass = Compile(sourceCode, compilerVersion);
  32. var types = ass.GetTypes();
  33. if (types == null || types.Length == 0)
  34. throw new Exception("Compile assembly produced no types");
  35. else if (types.Length != 1)
  36. throw new Exception("Compile assembly has more than one type");
  37. else
  38. return types[0];
  39. }
  40. internal object compileAndInstantiate(string sourceCode, string compilerVersion = "4.0")
  41. {
  42. var mainType = CompileAndGetType(sourceCode, compilerVersion);
  43. return Activator.CreateInstance(mainType);
  44. }
  45. private CompilerParameters PrepareCompileParametrs()
  46. {
  47. var ps = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = true };
  48. foreach (var reference in AppDomain.CurrentDomain.GetAssemblies())
  49. {
  50. try
  51. {
  52. ps.ReferencedAssemblies.Add(reference.Location);
  53. }
  54. catch (Exception ex)
  55. {
  56. string s = "cannot add assembly " + reference.FullName + " " + ex.Message;
  57. Debug.WriteLine(s);
  58. }
  59. }
  60. return ps;
  61. }
  62. }
  63. }
"Form1.cs"
Листинг программы
  1. using System;
  2. using System.Windows.Forms;
  3. namespace WindowsFormsApplication1
  4. {
  5. public partial class Form1 : Form
  6. {
  7. IHtmlConverter converter = new HtmlConverter();
  8. public Form1()
  9. {
  10. InitializeComponent();
  11. }
  12. private void button1_Click(object sender, EventArgs e)
  13. {
  14. tbOut.Text = converter.Converter(tbIn.Text);
  15. }
  16. private void button2_Click(object sender, EventArgs e)
  17. {
  18. var ce = new CodeEditor("..\\..\\HtmlConverter.cs");
  19. ce.ShowDialog();
  20. converter = (IHtmlConverter)new InProcessCompiler().compileAndInstantiate(ce.Source);
  21. }
  22. }
  23. }

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

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

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


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

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

9   голосов , оценка 3.667 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы