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

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

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

Часто видел разные примеры программной компиляции кода консольных приложений типа вот этого:
Листинг программы
  1. using System;
  2. using System.CodeDom.Compiler;
  3. using System.Collections.Generic;
  4. using Microsoft.CSharp;
  5. namespace ConsoleCompiler
  6. {
  7. internal class Program
  8. {
  9. private static void Main(string[] args)
  10. {
  11. // Source code для компиляции
  12. string source =
  13. @"
  14. namespace Foo
  15. {
  16. public class Bar
  17. {
  18. static void Main(string[] args)
  19. {
  20. Bar.SayHello();
  21. }
  22. public static void SayHello()
  23. {
  24. System.Console.WriteLine(""Hello World"");
  25. }
  26. }
  27. }
  28. ";
  29. // Настройки компиляции
  30. Dictionary<string, string> providerOptions = new Dictionary<string, string>
  31. {
  32. {"CompilerVersion", "v3.5"}
  33. };
  34. CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
  35. CompilerParameters compilerParams = new CompilerParameters
  36. {OutputAssembly = "D:\\Foo.EXE", GenerateExecutable = true};
  37. // Компиляция
  38. CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
  39. // Выводим информацию об ошибках
  40. Console.WriteLine("Number of Errors: {0}", results.Errors.Count);
  41. foreach (CompilerError err in results.Errors)
  42. {
  43. Console.WriteLine("ERROR {0}", err.ErrorText);
  44. }
  45. }
  46. }
  47. }
А как можно скомпилить программно код проэкта приложения windows forms. Проблема в том что не пойму как соединить весь код приложения(programs.cs, сама форма и дополнительные компоненты)
Нашёл способ скомпилить программно, но появилась новая проблема: Как сделать чтобы скомпилиное приложение при запуске запускало только форму не открывая командную строку(у меня вначале открывает командную строку, а потом уже форму, если закрыть форму, закроется и командная строка, если закрыть командную строку закроется и форма! Вот мой код на компиляцию:
Листинг программы
  1. using Microsoft.CSharp;
  2. using System;
  3. using System.CodeDom.Compiler;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using System.Windows.Forms;
  12. namespace WindowsFormsApplication5
  13. {
  14. public partial class Form1 : Form
  15. {
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. private void button1_Click(object sender, EventArgs e)
  21. {
  22. string source =
  23. @"
  24. using System;
  25. using System.CodeDom.Compiler;
  26. using System.Collections.Generic;
  27. using System.ComponentModel;
  28. using System.Data;
  29. using System.Drawing;
  30. using System.Linq;
  31. using System.Text;
  32. using System.Windows.Forms;
  33. namespace WindowsFormsApplication6
  34. {
  35. static class Program
  36. {
  37. /// <summary>
  38. /// Главная точка входа для приложения.
  39. /// </summary>
  40. [STAThread]
  41. static void Main()
  42. {
  43. Application.EnableVisualStyles();
  44. Application.SetCompatibleTextRenderingDefault(false);
  45. Application.Run(new Form1());
  46. }
  47. }
  48. partial class Form1
  49. {
  50. /// <summary>
  51. /// Требуется переменная конструктора.
  52. /// </summary>
  53. private System.ComponentModel.IContainer components = null;
  54. /// <summary>
  55. /// Освободить все используемые ресурсы.
  56. /// </summary>
  57. /// <param name= " + "\"" + "disposing" + "\"" + @" >истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
  58. protected override void Dispose(bool disposing)
  59. {
  60. if (disposing && (components != null))
  61. {
  62. components.Dispose();
  63. }
  64. base.Dispose(disposing);
  65. }
  66. #region Код, автоматически созданный конструктором форм Windows
  67. /// <summary>
  68. /// Обязательный метод для поддержки конструктора - не изменяйте
  69. /// содержимое данного метода при помощи редактора кода.
  70. /// </summary>
  71. private void InitializeComponent()
  72. {
  73. this.textBox1 = new System.Windows.Forms.TextBox();
  74. this.SuspendLayout();
  75. //
  76. // textBox1
  77. //
  78. this.textBox1.Location = new System.Drawing.Point(135, 214);
  79. this.textBox1.Name = " + "\"" + "textBox1" + "\"" + @";
  80. this.textBox1.Size = new System.Drawing.Size(341, 20);
  81. this.textBox1.TabIndex = 0;
  82. this.textBox1.Text = " + "\"" + "Проверка" + "\"" + @";
  83. this.textBox1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
  84. //
  85. // Form1
  86. //
  87. this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  88. this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  89. this.ClientSize = new System.Drawing.Size(682, 471);
  90. this.Controls.Add(this.textBox1);
  91. this.Name = " + "\"" + "Form1" + "\"" + @";
  92. this.Text = " + "\"" + "Form1" +"\"" + @";
  93. this.ResumeLayout(false);
  94. this.PerformLayout();
  95. }
  96. #endregion
  97. private System.Windows.Forms.TextBox textBox1;
  98. }
  99. public partial class Form1 : Form
  100. {
  101. public Form1()
  102. {
  103. InitializeComponent();
  104. }
  105. }
  106. }
  107. ";
  108. // Настройки компиляции
  109. Dictionary<string, string> providerOptions = new Dictionary<string, string>
  110. {
  111. {"CompilerVersion", "v3.5"}
  112. };
  113. CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
  114. CompilerParameters compilerParams = new CompilerParameters { OutputAssembly = "D:\\Мои документы\\Form1.EXE", GenerateExecutable = true };
  115. compilerParams.ReferencedAssemblies.Add("System.dll");
  116. compilerParams.ReferencedAssemblies.Add("System.Core.dll");
  117. compilerParams.ReferencedAssemblies.Add("System.Data.dll");
  118. compilerParams.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
  119. compilerParams.ReferencedAssemblies.Add("System.Deployment.dll");
  120. compilerParams.ReferencedAssemblies.Add("System.Drawing.dll");
  121. compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
  122. compilerParams.ReferencedAssemblies.Add("System.Xml.dll");
  123. compilerParams.ReferencedAssemblies.Add("System.Xml.Linq.dll");
  124. // Компиляция
  125. CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source);
  126. //Выводим инфу об ошибках
  127. textBox1.Text = "Количество ошибок: " + results.Errors.Count;
  128. int n = 0;
  129. foreach (CompilerError err in results.Errors)
  130. {
  131. n = n + 1;
  132. richTextBox1.Text = richTextBox1.Text + "Ошибка №" + n + err.ErrorText + "\n";
  133. }
  134. }
  135. }
  136. }

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

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

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


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

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

12   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы