Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > С# ICodeCompiler, компиляция кода


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

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

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

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

Заранее спасибо.

Автор: mr.DUDA 6.4.2008, 09:28
Пример:
Код
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.

Автор: bobr 6.4.2008, 10:58
mr.DUDA, , большое спасибо!!!

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

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

Заранее спасибо.

Автор: mr.DUDA 6.4.2008, 12:43
Код
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);
            }
        }
    }
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)