Компиляция из программы

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

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


Что-то подобное писал, вот кусок кода, расписывать его не буду, но думаю немного поможет!
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, действительно полезный код.


Неплохо бы это засунуть в раздел исходники (предварительно сделав код самодостаточным). Я сейчас этим заняться не могу, надеюсь, это сделает кто-нибудь другой.


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();


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


здесь небольшое приложение, которое использует сгенерённую сборкунадо же, какой я, оказывается, уже старый на этом форуме