简体   繁体   English

动态编译Windows应用程序时如何隐藏控制台窗口?

[英]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? 实际上,我的问题是一年前在此主题中提出的- 运行动态编译的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 . 它主要来自Microsoft支持, 网址为http://support.microsoft.com/kb/304655/zh-cn

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: 添加> paramters.CompilerOptions / t:winexe似乎对我有用:

        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. 没有/ t:winexe,我会看到一个命令窗口,如果按照自己的方式进行操作,将显示该窗口;如果添加了ProcessStartInfo,则该窗口将闪烁。 With the /t:winexe option the window went away for me, but I left the ProcessStartInfo set to NoWindow also. 使用/ t:winexe选项,窗口对我来说消失了,但是我也将ProcessStartInfo设置为NoWindow。

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. 当我处理完CodeDom时,我们编译了动态用户输入,该用户输入代表了用户创建的计算和公式。 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 嵌入式脚本引擎本来是一个更好的选择,但是没有一种经济有效的方法可以将其淘汰并替换,因此我们在技术上致力于该方法

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM