Динамическая компиляция приложений с визуальным интерфейсом - C#

Узнай цену своей работы

Формулировка задачи:

Часто видел разные примеры программной компиляции кода консольных приложений типа вот этого:
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using Microsoft.CSharp;
 
namespace ConsoleCompiler
{
  internal class Program
  {
    private static void Main(string[] args)
    {
      // Source code для компиляции
      string source =
      @"
namespace Foo
{
  public class Bar
  {
    static void Main(string[] args)
    {
      Bar.SayHello();
    }
 
    public static void SayHello()
    {
      System.Console.WriteLine(""Hello World"");
    }
  }
}
      ";
 
      // Настройки компиляции
      Dictionary<string, string> providerOptions = new Dictionary<string, string>
        {
          {"CompilerVersion", "v3.5"}
        };
      CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
 
      CompilerParameters compilerParams = new CompilerParameters
        {OutputAssembly = "D:\\Foo.EXE", GenerateExecutable = true};
 
      // Компиляция
      CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
 
      // Выводим информацию об ошибках
      Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
      foreach (CompilerError err in results.Errors)
      {
        Console.WriteLine("ERROR {0}", err.ErrorText);
      }
    }
  }
}
А как можно скомпилить программно код проэкта приложения windows forms. Проблема в том что не пойму как соединить весь код приложения(programs.cs, сама форма и дополнительные компоненты)
Нашёл способ скомпилить программно, но появилась новая проблема: Как сделать чтобы скомпилиное приложение при запуске запускало только форму не открывая командную строку(у меня вначале открывает командную строку, а потом уже форму, если закрыть форму, закроется и командная строка, если закрыть командную строку закроется и форма! Вот мой код на компиляцию:
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string source =
      @"
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication6
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
    partial class Form1
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name= " + "\"" + "disposing" + "\"" + @" >истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.SuspendLayout();
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(135, 214);
            this.textBox1.Name = " + "\"" + "textBox1" + "\"" + @";
            this.textBox1.Size = new System.Drawing.Size(341, 20);
            this.textBox1.TabIndex = 0;
            this.textBox1.Text = " + "\"" + "Проверка" + "\"" + @";
            this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(682, 471);
            this.Controls.Add(this.textBox1);
            this.Name = " + "\"" + "Form1" + "\"" + @";
            this.Text = " + "\"" + "Form1" +"\"" + @";
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private System.Windows.Forms.TextBox textBox1;
    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
}
      ";
 
            // Настройки компиляции
            Dictionary<string, string> providerOptions = new Dictionary<string, string>
        {
          {"CompilerVersion", "v3.5"}
        };
            CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
 
            CompilerParameters compilerParams = new CompilerParameters { OutputAssembly = "D:\\Мои документы\\Form1.EXE", GenerateExecutable = true };
            compilerParams.ReferencedAssemblies.Add("System.dll");
            compilerParams.ReferencedAssemblies.Add("System.Core.dll");
            compilerParams.ReferencedAssemblies.Add("System.Data.dll");
            compilerParams.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
            compilerParams.ReferencedAssemblies.Add("System.Deployment.dll");
            compilerParams.ReferencedAssemblies.Add("System.Drawing.dll");
            compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            compilerParams.ReferencedAssemblies.Add("System.Xml.dll");
            compilerParams.ReferencedAssemblies.Add("System.Xml.Linq.dll");
 
            // Компиляция
            CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
            //Выводим инфу об ошибках
            textBox1.Text = "Количество ошибок: " + results.Errors.Count;
            int n = 0;
            foreach (CompilerError err in results.Errors)
            {
                n = n + 1;
                richTextBox1.Text = richTextBox1.Text + "Ошибка №" + n + err.ErrorText + "\n";
            }
        }
    }
}

Решение задачи: «Динамическая компиляция приложений с визуальным интерфейсом»

textual
Листинг программы
CompilerParameters compilerParams = new CompilerParameters { 
                            OutputAssembly = "D:\\Мои документы\\Form1.EXE",
                            GenerateExecutable = true,
                             CompilerOptions = "/target:winexe" };

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы