Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
1

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

21.10.2016, 12:56. Просмотров 947. Ответов 9

Мне необходимо было написать программу, одна из задач - можно редактировать код самой же этой программы. На просторах интернета нашел (было тяжело) реализацию этого, подогнал под нужные мне параметры, то есть открывается форма "CodeEditor.cs" (открытие происходит из "Form1.cs"), в которой можно редактировать код "HtmlConverter.cs" файла (находится в сборке), а "Class1.cs" компилирует уже отредактированный код (компиляция происходит при закрытии формы CodeEditor) и подменяет уже новый "HtmlConverter.cs" в ходе работы программы, но возникает ошибка в "Class1.cs" на строке "var results = p.CompileAssemblyFromSource(ps, new[] { sourceCode });": "Невозможно найти исполняемый файл компилятора csc.exe.". Никак не могу разобраться как решить эту проблему. Помогите.... Что делать?
"CodeEditor.cs":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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":
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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"
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);
        }
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2016, 12:56
Ответы с готовыми решениями:

Ошибка при попытке запуска компилятора csc.exe
При запуске из командной строки команды команды: csc C:\myproject.cs выдается...

Ошибка 0019 Оператор "+" невозможно применить к операнду типа "string" и "группа методов"
public string PrintEquiliteralTriangle() { ...

Ошибка "Неявное преобразование типа "System.DateTime" в "string" невозможно"
Неявное преобразование типа &quot;System.DateTime&quot; в &quot;string&quot; невозможно вот в этой...

Ошибка 2 Аргумент "1": преобразование типа из "int[]" в "object[]" невозможно
object - базовый класс для int. Тогда почему невозможно преобразовать int в...

Ошибка на других ПК: Невозможно загрузить файл или сборку "ChilkatDotNet4.dll"
Здравствуйте, пишу консольное приложение в Visual Studio 2012, приложение очень...

9
OwenGlendower
Супер-модератор
Эксперт .NET
9682 / 8427 / 3611
Регистрация: 17.03.2014
Сообщений: 16,875
Записей в блоге: 1
21.10.2016, 14:09 2
Лучший ответ Сообщение было отмечено Edward1426 как решение

Решение

Edward1426, версию компилятора нужно начинать с v. Об этом написано в документации на конструктор класса CSharpCodeProvider. Поэтому замени везде "4.0" на "v4.0".
1
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
21.10.2016, 14:32  [ТС] 3
Спасибо, да, это решило проблему, но появилась очередная проблема: в "Class1.cs" на строке "return results.CompiledAssembly;" ошибка: "Не удалось загрузить файл или сборку "file:///C:\Users\ed\AppData\Local\Temp\roycf2e1.exe" либо одну из их зависимостей. Не удается найти указанный файл.". Вы знаете как решить эту проблему? Буду очень благодарен!
0
OwenGlendower
Супер-модератор
Эксперт .NET
9682 / 8427 / 3611
Регистрация: 17.03.2014
Сообщений: 16,875
Записей в блоге: 1
21.10.2016, 14:50 4
Edward1426, наверное это одна из временных сборок которые создает CodeDom. Можно попытаться не добавлять ссылки на сборки которые находятся в папке %TEMP%.
1
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
21.10.2016, 15:37  [ТС] 5
OwenGlendower, Да, скорее всего; название exe файла при новом запуске изменяется, а самого exe файла при поиске ч/з проводник нету. Извините, я новичок в этом деле, поэтому я не пойму как не добавлять ссылки на сборки и разве вообще я их добавлял?
0
OwenGlendower
Супер-модератор
Эксперт .NET
9682 / 8427 / 3611
Регистрация: 17.03.2014
Сообщений: 16,875
Записей в блоге: 1
21.10.2016, 20:00 6
Цитата Сообщение от Edward1426 Посмотреть сообщение
поэтому я не пойму как не добавлять ссылки на сборки и разве вообще я их добавлял?
Добавление делается в методе PrepareCompileParametrs в строке ps.ReferencedAssemblies.Add(reference.Location);. Добавь проверку Location и и исключай папку с временными файлами.
1
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
23.10.2016, 08:24  [ТС] 7
Извините, но я никак не могу решить эту проблему и как добавить эту проверку?
0
OwenGlendower
Супер-модератор
Эксперт .NET
9682 / 8427 / 3611
Регистрация: 17.03.2014
Сообщений: 16,875
Записей в блоге: 1
23.10.2016, 14:33 8
Edward1426,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private CompilerParameters PrepareCompileParametrs()
{
    var ps = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = true };
    string tempRoot = System.IO.Path.GetTempPath();
    foreach (var reference in AppDomain.CurrentDomain.GetAssemblies())
    {
        try
        {
            string location = reference.Location;
            if (!location.StartsWith(tempRoot, StringComparison.OrdinalIgnoreCase))
            {
                ps.ReferencedAssemblies.Add(location);
            }
        }
        catch (Exception ex)
        {
            string s = "cannot add assembly " + reference.FullName + " " + ex.Message;
            Debug.WriteLine(s);
        }
    }
    return ps;
}
1
Edward1426
1 / 1 / 0
Регистрация: 21.10.2016
Сообщений: 29
23.10.2016, 15:51  [ТС] 9
OwenGlendower, Огромное Вам спасибо, извиняюсь, за то что потратил Ваше время. По своей глупости не обратил внимание на ошибки, которые выдавал мне этот участок кода:
C#
1
2
3
4
5
6
if (results.Errors.HasErrors)
            {
                var sb = new StringBuilder();
                foreach (var e in results.Errors)
                    sb.AppendLine(e.ToString());
            }
Оказалось, что проблема была в IHtmlConverter.cs, там нужно было поставить модификатор доступа public)))))
0
OwenGlendower
Супер-модератор
Эксперт .NET
9682 / 8427 / 3611
Регистрация: 17.03.2014
Сообщений: 16,875
Записей в блоге: 1
23.10.2016, 15:57 10
Edward1426, главное что удалось разобраться с ошибкой
1
23.10.2016, 15:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2016, 15:57

Ошибка 12 не удалось скопировать файл "obj\x86\Debug\ttt.exe" — файл не найден
C# Программа вдруг перестала запускаться (до этого работала. Последние действия...

Ошибка: Невозможно преобразовать "лямбда-выражение" к типу "bool", поскольку он не является делегатом
По книге Шилдта, рассматриваю тему массивов, предлагают пример, с...

Ошибка с округлением. Неявное преобразование типа "double" в "float" невозможно
Добрый день! Подскажите, пожалуйста. Выдает ошибку в строке: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru