这是一个小错误(我愿意为了上线的利益而坦白地生活),但我想知道是否有其他人有想法来修复它。
我有一个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();
}
}
}
有人有什么想法吗?
答案 0 :(得分:4)
我的第一个猜测是仔细检查您的项目属性设置,并确保输出类型是Windows应用程序而不是控制台应用程序。
答案 1 :(得分:4)
我找到了。
在Visual Studio中构建项目时,没有问题 - 没有控制台窗口。
当项目是从CruiseControl构建的时候,那就是我们得到一个控制台窗口。
区别? Visual Studio(根据我选择的WinForms应用程序)将/ target:winexe追加到csc行。
CruiseControl调用一系列NAnt脚本。在source.build脚本中,编译步骤配置错误,并且目标是exe而不是winexe - 相当于在VS中选择“Console App”。因此,发布版本与调试版本的控制台窗口。
相关的NAnt:
<csc output="${build.outputPath}\[myapp].exe" target="winexe" debug="Full" rebuild="true">
<!-- lots of references, sources and resources -->
</csc>
是的,现在我感到愚蠢。 :)
答案 2 :(得分:1)
如果在Visual Studio中导航到项目的“属性”选项卡,则应该能够将输出类型设置为Windows应用程序。听起来它当前可能设置为控制台应用程序。
答案 3 :(得分:1)
如上所述,请检查以确保项目的属性设置为Windows应用程序而不是控制台应用程序。如果这不是问题,那么应用程序的组件可能是使用Win32 API调用AllocConsole()
手动创建控制台窗口,或者您可能在后台启动命令行应用程序而不使用UseShellExecute=false; CreateNoWindow=true;
在你的StartInfo中。
答案 4 :(得分:1)
备份您的代码,然后破解它,删除与此问题无关的所有内容。换句话说,有一个“删除代码,让它构建,运行它,看看控制台是否仍然弹出”的循环。最终你应该发现问题,或者发布一个简短但完整的程序,以便我们可以重现它并帮助修复它。