How do I hide the console window when dynamically compiling a windows application?
Actually, my question was asked a year ago in this topic - Why do I see a console window when I run a dynamically compiled EXE?
Now I have the very same problem, only I don't use the command line compiler, so that solution doesn't suite me.
Please help. Thanks a lot!
EDIT
Here is the code. It was mostly taken from Microsoft Support from here http://support.microsoft.com/kb/304655/en-us.
Since it's dynamic compilation, I don't know where to pass the notion that I don't need the console showing.
Sorry it's pretty big, since the string source is my whole other class.
using System.Windows.Forms;
using System.Diagnostics;
using System.CodeDom.Compiler;
using System;
using System.Drawing;
using System.IO;
namespace compile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1.Click += new EventHandler(button1_Click);
}
void button1_Click(object sender, EventArgs e)
{
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
string Output = "Out.exe";
Button ButtonObject = (Button)sender;
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
//Make sure we generate an EXE, not a DLL
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Drawing.Dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
////////////////////////////////////////////////////////////////////////////////////
string text = @"using System;
using System.Windows.Forms;
using System.Drawing;
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TestForm());
}
}
partial class TestForm
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
private void InitializeComponent()
{
//System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TestForm));
this.MainLabel = new System.Windows.Forms.Label();
this.MainLabel2 = new System.Windows.Forms.Label();
this.BackBtn = new System.Windows.Forms.Button();
this.NextBtn = new System.Windows.Forms.Button();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.elementPanel = new System.Windows.Forms.Panel();
this.label1 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.elementPanel.SuspendLayout();
this.SuspendLayout();
//
// MainLabel
//
this.MainLabel.AutoSize = true;
this.MainLabel.Font = new System.Drawing.Font(""Microsoft Sans Serif"", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.MainLabel.Location = new System.Drawing.Point(10, 9);
this.MainLabel.Name = ""MainLabel"";
this.MainLabel.Size = new System.Drawing.Size(126, 18);
this.MainLabel.TabIndex = 0;
this.MainLabel.Text = ""Вопросы теста"";
//
// MainLabel2
//
this.MainLabel2.AutoSize = true;
this.MainLabel2.Font = new System.Drawing.Font(""Microsoft Sans Serif"", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.MainLabel2.Location = new System.Drawing.Point(10, 38);
this.MainLabel2.Name = ""MainLabel2"";
this.MainLabel2.Size = new System.Drawing.Size(479, 16);
this.MainLabel2.TabIndex = 1;
this.MainLabel2.Text = ""Выберите правильные ответы на вопросы из предложенных вариантов."";
//
// BackBtn
//
this.BackBtn.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.BackBtn.Font = new System.Drawing.Font(""Microsoft Sans Serif"",
9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.BackBtn.Location = new System.Drawing.Point(447, 401);
this.BackBtn.Name = ""BackBtn"";
this.BackBtn.Size = new System.Drawing.Size(88, 26);
this.BackBtn.TabIndex = 3;
this.BackBtn.Text = ""Назад"";
this.BackBtn.UseVisualStyleBackColor = true;
//
// NextBtn
//
this.NextBtn.Anchor =
((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom |
System.Windows.Forms.AnchorStyles.Right)));
this.NextBtn.Font = new System.Drawing.Font(""Microsoft Sans Serif"",
9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.NextBtn.Location = new System.Drawing.Point(541, 401);
this.NextBtn.Name = ""NextBtn"";
this.NextBtn.Size = new System.Drawing.Size(88, 26);
this.NextBtn.TabIndex = 4;
this.NextBtn.Text = ""Вперед"";
this.NextBtn.UseVisualStyleBackColor = true;
//
// groupBox1
//
this.groupBox1.Anchor =
((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
|
System.Windows.Forms.AnchorStyles.Right)));
this.groupBox1.Controls.Add(this.elementPanel);
this.groupBox1.Controls.Add(this.MainLabel2);
this.groupBox1.Controls.Add(this.NextBtn);
this.groupBox1.Controls.Add(this.MainLabel);
this.groupBox1.Controls.Add(this.BackBtn);
this.groupBox1.Location = new System.Drawing.Point(2, 0);
this.groupBox1.Name = ""groupBox1"";
this.groupBox1.Size = new System.Drawing.Size(635, 433);
this.groupBox1.TabIndex = 5;
this.groupBox1.TabStop = false;
//
// elementPanel
//
this.elementPanel.Anchor =
((System.Windows.Forms.AnchorStyles) ((((System.Windows.Forms.AnchorStyles.Top |
System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
|
System.Windows.Forms.AnchorStyles.Right)));
this.elementPanel.AutoScroll = true;
this.elementPanel.Controls.Add(this.label1);
this.elementPanel.Location = new System.Drawing.Point(6, 57);
this.elementPanel.Name = ""elementPanel"";
this.elementPanel.Size = new System.Drawing.Size(624, 338);
this.elementPanel.TabIndex = 5;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font(""Microsoft Sans Serif"",
9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
this.label1.Location = new System.Drawing.Point(4, 11);
this.label1.MaximumSize = new System.Drawing.Size(610, 0);
this.label1.Name = ""label1"";
this.label1.Size = new System.Drawing.Size(601, 30);
this.label1.TabIndex = 0;
this.label1.Text =
""mmmmmmmmmmmm\r\n"";
//
// TestForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(638, 433);
this.Controls.Add(this.groupBox1);
//this.Icon = ((System.Drawing.Icon)(resources.GetObject(""$this.Icon"")));
this.Name = ""TestForm"";
this.StartPosition =
System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = ""Тест на знание английского языка"";
this.Load += new System.EventHandler(this.TestForm_Load);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.elementPanel.ResumeLayout(false);
this.elementPanel.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.Label MainLabel;
private System.Windows.Forms.Label MainLabel2;
private System.Windows.Forms.Button BackBtn;
private System.Windows.Forms.Button NextBtn;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Panel elementPanel;
private System.Windows.Forms.Label label1;
}
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
}
private void TestForm_Load(object sender, EventArgs e)
{
BackBtn.Enabled = false;
this.MouseWheel += new MouseEventHandler(TestForm_MouseWheel);
int loc = 24 + label1.Height;
for (int i = 0; i < 20; i++)
{
RadioButton newR = new RadioButton();
newR.Text = ""test"";
newR.AutoSize = true;
newR.Location = new Point(4, loc);
loc += 24;
开发者_运维百科 elementPanel.Controls.Add(newR);
}
}
void TestForm_MouseWheel(object sender, MouseEventArgs e)
{
elementPanel.Focus();
}
}
";
////////////////////////////////////////////////////////////////////////////////////
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, text);
if (results.Errors.Count > 0)
{
foreach (CompilerError CompErr in results.Errors)
{
textBox2.Text = textBox2.Text +
"Line number " + CompErr.Line +
", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + ";" +
Environment.NewLine + Environment.NewLine;
}
}
else
{
//Successful Compile
textBox2.ForeColor = Color.Blue;
textBox2.Text = "Success!";
Process.Start(Output);
}
}
}
}
Adding > paramters.CompilerOptions /t:winexe seemed to work for me:
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
string output = "Out.exe";
var parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
parameters.OutputAssembly = output;
parameters.ReferencedAssemblies.Add("System.dll");
parameters.ReferencedAssemblies.Add("System.Drawing.Dll");
parameters.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
parameters.CompilerOptions = "/t:winexe";
var results = codeProvider.CompileAssemblyFromSource(parameters, "namespace Bah { static class Program { static void Main() { System.Threading.Thread.Sleep(100000); } } }");
But I also added this (for good measure):
var psi = new ProcessStartInfo(output) {CreateNoWindow = true};
Process.Start(output);
Without the /t:winexe I got a command window, which would show up if done your way, or flicker if the ProcessStartInfo was added. With the /t:winexe option the window went away for me, but I left the ProcessStartInfo set to NoWindow also.
I'd like to pontificate that compiling a form like that is really rigid and fragile and there doesn't seem to be any reason to do it. When I've dealt with the CodeDom, we compiled dynamic user imput that represented calculations and formulas that the user had created. It was difficult to manage, and slow for large packages. An embedded scripting engine would have been a better choice, but there was no cost-effective way to rip it out and replace it, and so we were technically committed to that approach
精彩评论