代码之家  ›  专栏  ›  技术社区  ›  John Rudy

WinForm启动时显示控制台窗口(C)

  •  4
  • John Rudy  · 技术社区  · 16 年前

    这是一个小问题(坦率地说,我愿意为了上线而与之共处),但我想知道是否还有其他人有办法解决它。

    我有一个C WinForms应用程序。当应用程序通过可执行文件(而不是通过调试器)启动时,用户首先看到的是控制台窗口,然后是主窗口(预加载完成后)。

    我不想显示控制台窗口。(就像我说的,这是一只小虫子。)

    项目输出已设置为Windows应用程序。

    这里是main()方法的(大部分)代码。我删掉了各种与专有/安全相关的东西,在适当的时候用注释替换掉。

    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
    
            // SNIP: Get username from Windows, associate with DB user
    
            if (user == null || user.UID == 0 || (user.Active.HasValue && !(user.Active.Value)))
            {
                MessageBox.Show(ErrorStrings.UnknownUser, ErrorStrings.TitleBar, MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
                Application.Exit();
                return;
            }
    
            // SNIP: Associate user with employee object    
    
            Application.Run(new MainForm());
        }
        catch (Exception ex)
        {
            if (ExceptionPolicy.HandleException(ex, UiStrings.ExceptionPolicy))
            {
                string message = ErrorStrings.UnhandledPreface + ex.ToString();
                MessageBox.Show(message, ErrorStrings.TitleBar, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
    }
    

    有人有什么想法吗?

    5 回复  |  直到 16 年前
        1
  •  4
  •   Nick    16 年前

    我的第一个猜测是再次检查您的项目属性设置,并确保输出类型是Windows应用程序而不是控制台应用程序。

        2
  •  4
  •   John Rudy    16 年前

    我找到了。

    在Visual Studio中构建项目时,没有问题——没有控制台窗口。

    当这个项目是从CruiseControl构建的时候,我们得到了一个控制台窗口。

    区别是什么?Visual Studio(基于我对WinForms应用程序的选择)正在将/Target:WinExe附加到CSC行。

    CruiseControl调用一系列nant脚本。在source.build脚本中,编译步骤配置错误,它的目标是exe而不是winexe——这相当于在vs.中选择“console app”,因此,在release builds与debug builds中有一个控制台窗口。

    相关名词:

    <csc output="${build.outputPath}\[myapp].exe" target="winexe" debug="Full" rebuild="true">
        <!-- lots of references, sources and resources -->
    </csc>
    

    是啊,现在我觉得很笨。:)

        3
  •  1
  •   Ben Hoffstein    16 年前

    如果在Visual Studio中导航到项目的“属性”选项卡,则应该能够将输出类型设置为Windows应用程序。听起来它当前可能被设置为控制台应用程序。

        4
  •  1
  •   Stephen Deken    16 年前

    如上所述,检查以确保项目的属性设置为Windows应用程序而不是控制台应用程序。如果这不是问题所在,则应用程序的组件可能正在使用win32 api调用手动创建控制台窗口。 AllocConsole() 或者您可能在后台启动命令行应用程序而不使用 UseShellExecute=false; CreateNoWindow=true; 在您的StartInfo中。

        5
  •  1
  •   Jon Skeet    16 年前

    备份代码,然后破解它,删除与此问题无关的所有内容。换句话说,有一个“删除代码,让它构建,运行它,看看控制台是否仍然弹出”的循环。最终,你应该要么发现问题,要么发布一个简短但完整的程序,这样我们就可以复制它并帮助解决它。