17

[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など)を記述したことも、2番目のアプリケーションでフォーム関連の操作を記述したこともありません。私と同じように見えます。

それでも最初のアプリケーションはBLACKウィンドウを表示し、2番目のアプリケーションは何も表示しません。何がこのように機能するのですか?

4

4 に答える 4

33

ILDASMを使用してexeファイルを調べると、マニフェストに違いがあることがわかります(「サブシステム」を探してください)。

Winformsアプリケーションの場合:

.subsystem 0x0002       // WINDOWS_GUI

コンソールアプリケーションの場合:

.subsystem 0x0003       // WINDOWS_CUI

ILコードにはさらに多くの違いがある可能性があります。

2つのケースでコンパイラがこれを異なる方法で出力する理由については、これはプロジェクトファイルのOutputType値によって制御されます。

Winformsアプリケーションの場合:

<OutputType>WinExe</OutputType>

コンソールアプリケーションの場合:

<OutputType>Exe</OutputType>

好奇心から、クラスライブラリプロジェクトの値も確認しました。

<OutputType>Library</OutputType>
于 2009-05-29T07:12:58.917 に答える
10

プロジェクトのプロパティ、[アプリケーション]タブ、[出力の種類]で、[Windowsアプリケーション]または[コンソールアプリケーション]に設定できます。

舞台裏では、VSはFredrikが彼の投稿で提示したことを正確に実行していると思います。

また、コンソールアプリケーションに設定すると、Windowsフォームプロジェクト用の黒いコンソールアプリケーションが表示されます。

于 2009-05-29T07:18:38.097 に答える
8

ボンネットの下では、「コンソールが必要です」というPEヘッダーのフラグを除いて、winformとconsoleexeに違いはありません。PEヘッダーはC#から制御されないため(ランタイムのものではなくコンパイルのものであるため)、代わりにプロジェクトファイルで定義されます(<OutputType>...</OutputType>)。

またはコマンドラインで(csc /target:exevs csc /target:winexe)。

おそらく、コンパイラがインターセプトしたアセンブリレベルの属性を使用できたはずですが、それは本当に役に立ちましたか?おそらくそうではありません。

于 2009-05-29T07:25:24.663 に答える
3

プロジェクトファイル(csproj)を見ると、ターゲットがコンソールまたはWindowsアプリとして定義されていることがわかります。

于 2009-05-29T07:22:12.410 に答える