【问题标题】:What makes an app console or Windows Form application?是什么构成了应用程序控制台或 Windows 窗体应用程序?
【发布时间】:2009-05-29 07:10:14
【问题描述】:

[Visual Studio 2008]

我为控制台应用程序创建了一个新项目并将其修改为如下所示:

class Program
{
    static void Main (string[] args) {
        Thread.Sleep (2000);
    }
}

然后我为 Windows 窗体应用程序创建了另一个项目并对其进行了修改:


static class Program
{
    //[STAThread] commented this line
    static void Main (string[] args) { //Added args
        //Commented following lines
        //Application.EnableVisualStyles ();
        //Application.SetCompatibleTextRenderingDefault (false);
        //Application.Run (new Form1 ()); commented this line
        Thread.Sleep (2000);
    }
}

现在我既没有在第一个应用程序中编写控制台功能(Console.Write 等),也没有在第二个应用程序中编写与表单相关的操作。和我一模一样。

第一个应用程序仍然显示黑色窗口,第二个应用程序没有显示任何内容。是什么让它这样工作?

【问题讨论】:

  • 您可以通过适当的编译器开关将任何项目类型编译为程序集。

标签: c# .net winforms visual-studio-2008 console-application


【解决方案1】:

如果您使用 ILDASM 检查 exe 文件,您会发现 Manifest 中存在差异(查找“子系统”)。

在 Winforms 应用程序中:

.subsystem 0x0002       // WINDOWS_GUI

在控制台应用程序中:

.subsystem 0x0003       // WINDOWS_CUI

IL 代码可能有更多不同。

当谈到是什么让编译器在这两种情况下发出不同的信号时,这是由项目文件的 OutputType 值控制的:

在 Winforms 应用程序中:

<OutputType>WinExe</OutputType>

在控制台应用程序中:

<OutputType>Exe</OutputType>

出于好奇,我还检查了类库项目的该值:

<OutputType>Library</OutputType>

【讨论】:

  • 我明白你的意思,但我的问题恰恰是:是什么让 Visual Studio(或编译器)产生了这种差异?应用程序中的任何内容都必须由我们编写的代码来管理。对吗?
  • 对于编译器来说没有区别,都与你在项目设置和引用中设置的程序集类型有关。
  • 由于这些不同的设置,生成的输出会有所不同,Windows 在启动时会以不同的方式对待应用程序。我想你可以说“OutputType”元素是推动这种区别的“代码”。
  • 发现这个是为了寻找 Exe 和 WinExe MSBuild 输出类型之间的差异。非常有帮助,谢谢!
【解决方案2】:

在项目属性、应用程序选项卡、输出类型中,您可以设置为“Windows 应用程序”或“控制台应用程序”。

我相信 VS 在幕后所做的正是 Fredrik 在他的帖子中介绍的。

此外,将其设置为控制台应用程序将显示 Windows Forms 项目的黑色控制台应用程序。

【讨论】:

  • 为了完整起见,还有一个选项可以输出到类库。
【解决方案3】:

在引擎盖下,winform 与控制台 exe 没有区别,除了 PE 标头中的一个标志,上面写着“我需要一个控制台”。 PE 标头不受 C# 控制(因为它是编译的东西,而不是运行时的东西),所以它是在项目文件中定义的 (&lt;OutputType&gt;...&lt;/OutputType&gt;)。

或者在命令行中(csc /target:exe vs csc /target:winexe)。

可以说,他们本可以使用编译器拦截的程序集级属性——但这真的有帮助吗?应该不会吧。

【讨论】:

【解决方案4】:

如果您查看项目文件 (csproj),您会看到目标被定义为控制台或 Windows 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多