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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Компиляция из программы 
V
    Опции темы
anonym
Дата 26.7.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ситуация следующая. В программе должна быть такая возможность: скомпилировать другую программу, к которой имеется исходный текст, на C++/C# и либо получить экзешник, либо установить, что произошла ошибка компиляции. Компиляторы стандартные vс, csc. Как это реализовать - я пока не понимаю...

Это сообщение отредактировал(а) anonym - 26.7.2007, 21:21
PM MAIL   Вверх
mr.DUDA
Дата 26.7.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Есть классы пространства имён System.Runtime.CompilerServices.


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


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

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



Что-то подобное писал, вот кусок кода, расписывать его не буду, но думаю немного поможет!
Код

public int _Make(bool _GenerateInMemory)
        {// создать exe-файл выполняющий пользовательский код
            // коды завершения :
            // 0 - метод выполнился без ошибок
            // 1 - неопределенная ошибка
            // 2 - ошибка компиляции пользовательского кода
            try
            {
                CSharpCodeProvider codeProvider = new CSharpCodeProvider();
                ICodeCompiler icc = codeProvider.CreateCompiler();        

                // установка параметров компиляции
                System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
                parameters.GenerateExecutable = true;
                parameters.GenerateInMemory = _GenerateInMemory;
                parameters.OutputAssembly = this.__ExeName+".exe";
                foreach (string ReferenceDll in this.__usingNamespaces)
                {
                    parameters.ReferencedAssemblies.Add(ReferenceDll +".dll");
                }                        
                parameters.CompilerOptions = "/optimize";

                // создание exe-файл
                CompilerResults results = icc.CompileAssemblyFromSource(parameters,this._Code);
            
                // оброботка ошибок
                this.__ExeCompilationError.Clear();
                if (results.Errors.Count > 0)
                {
                    foreach(CompilerError CompErr in results.Errors)
                    {
                        this.__ExeCompilationError.Add(
                            "Строка " + CompErr.Line
                            + ", Ошибка "+ CompErr.ErrorNumber
                            + " "+ CompErr.ErrorText 
                            + ";"                        
                            );                    
                    }
                    return 2;
                }
                        
                this.__ExeCompilationError.Add("ОК");            
                return 0;
            }
            catch { return 1; }
        }


Это сообщение отредактировал(а) andrx - 27.7.2007, 09:26
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
anonym
Дата 27.7.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Благодарю! 

andrx, действительно полезный код.
PM MAIL   Вверх
Exception
Дата 29.7.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Неплохо бы это засунуть в раздел исходники (предварительно сделав код самодостаточным). Я сейчас этим заняться не могу, надеюсь, это сделает кто-нибудь другой.
PM   Вверх
mihryak
Дата 30.7.2007, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

using System;
using System.CodeDom.Compiler;
using Microsoft.CSharp;

Код

    public class CSharpCompiler
    {
        #region Constants

        private const string ExeExtension = ".exe";
        private const string DllExtension = ".dll";

        #endregion

        #region Private Fields        
        
        private bool generateExecutable = true;
        private bool generateInMemory = false;
        private string[] sourceCode;
        private string[] assemblyNames;
        private string outputName;     

        #endregion

        #region Constructors

        public CSharpCompiler()
        {
        }

        public CSharpCompiler(string[] sourceCode) : this(sourceCode, null, "result",
            false, true)
        {
        }

        public CSharpCompiler(string[] sourceCode, string[] usingNamespaces,
            string outputName, bool generateInMemory, bool generateExecutable)
        {
            this.sourceCode = sourceCode;
            this.assemblyNames = usingNamespaces;
            this.outputName = outputName;
            this.generateInMemory = generateInMemory;
            this.generateExecutable = generateExecutable;
        }

        #endregion

        #region Properties

        public bool GenerateInMemory
        {
            get { return generateInMemory; }
            set { generateInMemory = value; }
        }

        public string[] SourceCode
        {
            get { return sourceCode; }
            set { sourceCode = value; }
        }

        public bool GenerateExecutable
        {
            get { return generateExecutable; }
            set { generateExecutable = value; }
        }

        public string OutputName
        {
            get { return outputName; }
            set { outputName = value; }
        }

        public string[] AssemblyNames
        {
            get { return assemblyNames; }
            set { assemblyNames = value; }
        }

        #endregion

        #region Methods

        /// <summary>
        /// Compiles an assembly from the specified array of strings containing source code
        /// </summary>
        /// <exception cref="ArgumentNullException">
        /// SourceCode
        /// -or
        /// OutputFile
        /// is a null reference.
        /// </exception>
        /// <exception cref="InvalidOperationException">
        /// Compile operation failed for some reason (see inner exception).
        /// </exception>
        /// <returns>
        /// Compiler results.
        /// </returns>
        public CompilerResults Compile()
        {
            if (SourceCode == null)
            {
                throw new ArgumentNullException("SourceCode");
            }

            if (OutputName == null)
            {
                throw new ArgumentNullException("OutputFile");
            }

            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters parameters = new CompilerParameters(AssemblyNames);

            parameters.GenerateExecutable = GenerateExecutable;
            parameters.GenerateInMemory = GenerateInMemory;
            parameters.OutputAssembly = GenerateExecutable ?
                OutputName + ExeExtension : OutputName + DllExtension;

            parameters.CompilerOptions = "/optimize";

            try
            {
                return provider.CompileAssemblyFromSource(parameters, SourceCode);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("Compile operation failed.", ex);
            }
        }

        #endregion
    }

Код

            CSharpCompiler compiler = new CSharpCompiler(source);

            compiler.OutputName = @"c:\out";
            compiler.GenerateExecutable = true;
            string[] assembilies = new string[1] { "System.dll" };
            compiler.AssemblyNames = assembilies;

            CompilerResults res = compiler.Compile();

PM MAIL ICQ   Вверх
Мурлыкатам_
Дата 1.4.2009, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 5.2.2007
Где: город-герой Минск

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



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


--------------------
Хочешь что-то сделать - сделай это сам или попроси помощи на винграде smile
user posted image
PM MAIL ICQ   Вверх
mihryak
Дата 1.4.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



здесь небольшое приложение, которое использует сгенерённую сборку

надо же, какой я, оказывается, уже старый на этом форуме smile

Это сообщение отредактировал(а) mihryak - 1.4.2009, 19:45
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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