Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> С# ICodeCompiler, компиляция кода, как скомпилировать код из файла 
:(
    Опции темы
bobr
Дата 6.4.2008, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.2.2007

Репутация: нет
Всего: нет



Друзья, на C# пишу текстовый редактор, который сможет компилировать-запускать набранный в нем программный код. 
Для этих целей использую  ICodeCompiler.

У меня есть такая мысль:

прочитать весь код из textBox, сохранить текст в файл с расширением .cs, отправить этот файл на компиляцию (ВОПРОС, как это сделать). 

Соостветственно, возникают трудности: как именно использовать ICodeCompiler, можно ли в нем компилировать код из файла, можно ли решить задачу компиляции набранного кода по-другому?

Заранее спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 6.4.2008, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Пример:
Код
using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;

namespace ConsoleApplication6
{
    class Program
    {
        static void Main()
        {
            string source = @"using System;

public class MyClass
{
    public MyClass()
    {
    }

    public void SayHello()
    {
        Console.WriteLine(""Bla-bla-bla"");
    }
}";


            using (CSharpCodeProvider compiler = new CSharpCodeProvider())
            {
                CompilerParameters compileParams = new CompilerParameters();
                compileParams.GenerateInMemory = true;
                compileParams.ReferencedAssemblies.Add(typeof(string).Assembly.Location); // mscorlib.dll
                compileParams.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location); // System.dll
                CompilerResults compileResults = compiler.CompileAssemblyFromSource(compileParams, source);
                if (compileResults.Errors.Count > 0)
                    return;

                Type type = compileResults.CompiledAssembly.GetType("MyClass");
                object obj = Activator.CreateInstance(type);
                type.GetMethod("SayHello").Invoke(obj, null);
            }
        }
    }
}


Также можно компилировать из файла(-ов), с пом. compiler.CompileAssemblyFromFile.


--------------------
user posted image
PM MAIL WWW   Вверх
bobr
Дата 6.4.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 23.2.2007

Репутация: нет
Всего: нет



mr.DUDA, , большое спасибо!!!

Хотелось бы уточнить, если можно, приведи пожалуйста участок кода, который компилирует код из файла. (Почитал MSDN, не совсем разобрался).

предположим, я прочитал текст из textBox в файл File1.cs , а каким макаром использовать compiler.CompileAssemblyFromFile ?

Заранее спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 6.4.2008, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Код
using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Text;
using System.Windows.Forms;
using Microsoft.CSharp;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonКомпиляция_Click(object sender, EventArgs e)
        {
            string source = textBoxИсходныйКод.Text;
            string sourcePath = @"c:\File1.cs";
            using (StreamWriter writer = new StreamWriter(sourcePath))
                writer.Write(source);

            using (CSharpCodeProvider compiler = new CSharpCodeProvider())
            {
                CompilerParameters compileParams = new CompilerParameters();
                compileParams.GenerateInMemory = true;
                compileParams.ReferencedAssemblies.Add(typeof(string).Assembly.Location); // mscorlib.dll
                compileParams.ReferencedAssemblies.Add(typeof(System.ComponentModel.Component).Assembly.Location); // System.dll
                CompilerResults compileResults = compiler.CompileAssemblyFromFile(compileParams, sourcePath);

                if (compileResults.Errors.Count > 0)
                {
                    // были ошибки компиляции
                    StringBuilder sb = new StringBuilder();
                    foreach (CompilerError error in compileResults.Errors)
                        sb.AppendFormat("Ошибка: '{0}', строка: {1}", error.ErrorText, error.Line);
                    MessageBox.Show(sb.ToString(), "Компиляция завершилась с ошибками");
                    return;
                }

                // тут уже по обстоятельствам
                MessageBox.Show("Компиляция завершена успешно");

                //Type type = compileResults.CompiledAssembly.GetType("MyClass");
                //object obj = Activator.CreateInstance(type);
                //type.GetMethod("SayHello").Invoke(obj, null);
            }
        }
    }
}




--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.