Динамическая компиляция приложений с визуальным интерфейсом - C#
Формулировка задачи:
Часто видел разные примеры программной компиляции кода консольных приложений типа вот этого:
А как можно скомпилить программно код проэкта приложения windows forms. Проблема в том что не пойму как соединить весь код приложения(programs.cs, сама форма и дополнительные компоненты)
Листинг программы
- 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);
- }
- }
- }
- }
Нашёл способ скомпилить программно, но появилась новая проблема: Как сделать чтобы скомпилиное приложение при запуске запускало только форму не открывая командную строку(у меня вначале открывает командную строку, а потом уже форму, если закрыть форму, закроется и командная строка, если закрыть командную строку закроется и форма!
Вот мой код на компиляцию:
Листинг программы
- 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" };
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д