2009-05-29 106 views
13

[Visual Studio 2008中]什麼使得應用程序控制臺或Windows窗體應用程序?

我創建控制檯應用程序的新項目,並修改它看起來像這樣:

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

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

+1

您可以使用適當的編譯器開關將任何項目類型編譯爲程序集。 – Perpetualcoder 2009-05-29 07:30:17

回答

23

如果您檢查exe文件使用ILDASM,您可以看到Manifest中存在差異(查找「子系統」)。

在應用的Winforms:

.subsystem 0x0002  // WINDOWS_GUI 

在控制檯應用程序:

.subsystem 0x0003  // WINDOWS_CUI 

有可能在IL代碼更differencies。

當談到是什麼讓編譯器發出此不同在兩種情況下,這是由項目文件的輸出類型值控制:

在WinForms應用程序:

<OutputType>WinExe</OutputType> 

在一個控制檯應用程序:

<OutputType>Exe</OutputType> 

出於好奇,我也檢查了價值一個類庫項目:

<OutputType>Library</OutputType> 
+0

我明白了你的觀點,但我的問題正是這個:是什麼讓Visual Studio(或編譯器)創造了這種差異?任何應用程序必須由我們編寫的代碼來管理。對? – Hemant 2009-05-29 07:16:08

+1

對於編譯器來說沒有什麼區別,它們都與您在項目設置和參考中設置的組件類型有關。 – 2009-05-29 07:18:35

+0

添加了項目文件差異更新。 – 2009-05-29 07:21:19

9

在項目屬性,應用程序選項卡,輸出類型中,您可以設置爲「Windows應用程序」或「控制檯應用程序」。

我相信幕後的VS完全是弗雷德裏克在他的文章中提出的。

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

2

如果您查看項目文件(csproj),您會看到目標在那裏定義爲控制檯或Windows應用程序。

7

在引擎蓋下,除了PE頭中標有「我需要控制檯」的標誌之外,winform和console exe沒有區別。 PE頭不是由你的C#控制的(因爲它是一個編譯的東西,而不是運行時的東西),所以這是在項目文件中定義的(<OutputType>...</OutputType>)。

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

可以說,他們可以使用編譯器截獲的程序集級別的屬性 - 但真的有幫助嗎?可能不會。

相關問題