簡體   English   中英

是什么使應用程序控制台或Windows窗體應用程序?

[英]What makes an app console or Windows Form application?

[Visual Studio 2008]

我為控制台應用程序創建了一個新項目,並將其修改為如下所示:

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

然后我為Windows Form應用程序創建了另一個項目並進行了修改:


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函數(Console.Write等),也沒有在第二個應用程序中編寫與表單相關的操作。 看起來和我一模一樣。

第一個應用程序顯示BLACK窗口,第二個應用程序沒有顯示任何內容。 是什么讓它像這樣工作?

如果您檢查exe文件usine ILDASM,您可以看到Manifest存在差異(查找“子系統”)。

在Winforms應用程序中:

.subsystem 0x0002       // WINDOWS_GUI

在控制台應用程序中:

.subsystem 0x0003       // WINDOWS_CUI

IL代碼中可能存在更多差異。

當涉及到在兩種情況下編譯器以不同方式發出這種情況的原因時,這由項目文件的OutputType值控制:

在Winforms應用程序中:

<OutputType>WinExe</OutputType>

在控制台應用程序中:

<OutputType>Exe</OutputType>

出於好奇,我還檢查了類庫項目的值:

<OutputType>Library</OutputType>

在項目屬性,應用程序選項卡,輸出類型中,您可以設置為“Windows應用程序”或“控制台應用程序”。

我相信在幕后VS完全是Fredrik在帖子中提出的。

此外,將其設置為控制台應用程序將顯示Windows窗體項目的黑色控制台應用程序。

在引擎蓋下,winform與console exe沒有區別,只是PE-header中的一個標志顯示“我需要一個控制台”。 PE頭不受C#控制(因為它是編譯的東西,而不是運行時的東西),所以這是在項目文件中定義的( <OutputType>...</OutputType> )。

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

可以說,他們可以使用編譯器攔截的匯編級屬性 - 但這確實有幫助嗎? 可能不是。

如果您查看項目文件(csproj),您將看到目標在那里被定義為控制台或Windows應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM