2009-05-29 39 views
13

[Visual Studio 2008]Điều gì tạo ra ứng dụng Bảng điều khiển ứng dụng hoặc Windows Form?

Tôi tạo ra một dự án mới cho các ứng dụng giao diện điều khiển và sửa đổi nó trông như thế này:

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

Sau đó, tôi tạo ra một dự án khác cho ứng dụng Windows Form và sửa đổi nó:


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); 
    } 
} 

Bây giờ tôi không có chức năng bằng văn bản Console (Console.Write, v.v.) trong ứng dụng đầu tiên cũng như tôi không có các hoạt động liên quan đến biểu mẫu bằng văn bản trong lần thứ hai. Trông giống hệt tôi.

Ứng dụng đầu tiên vẫn hiển thị cửa sổ BLACK và cửa sổ thứ hai không hiển thị bất kỳ thứ gì. Điều gì làm cho nó hoạt động như thế này?

+1

bạn có thể biên dịch bất kỳ loại dự án nào thành một hội đồng có trình chuyển đổi trình biên dịch thích hợp. – Perpetualcoder

Trả lời

23

Nếu bạn kiểm tra tệp exe sử dụng ILDASM, bạn có thể thấy rằng có sự khác biệt trong Tệp kê khai (tìm "hệ thống con").

Trong một ứng dụng Winforms:

.subsystem 0x0002  // WINDOWS_GUI 

Trong một ứng dụng giao diện điều khiển:

.subsystem 0x0003  // WINDOWS_CUI 

Có thể có nhiều differencies trong mã IL.

Khi nói đến những gì làm cho trình biên dịch phát ra này khác nhau ở hai trường hợp, điều này được kiểm soát bởi giá trị OutputType hồ sơ dự án của:

Trong một ứng dụng Winforms:

<OutputType>WinExe</OutputType> 

Trong một ứng dụng giao diện điều khiển :

<OutputType>Exe</OutputType> 

Ra khỏi tò mò tôi cũng đã kiểm tra giá trị cho một dự án class Library:

<OutputType>Library</OutputType> 
+0

Tôi nhận được điểm của bạn nhưng câu hỏi của tôi là chính xác điều này: Điều gì làm cho Visual studio (hoặc trình biên dịch) tạo sự khác biệt này? Bất kỳ điều gì trong ứng dụng đều phải được điều chỉnh từ mã chúng tôi viết. Đúng? – Hemant

+1

Đối với trình biên dịch không có sự khác biệt, tất cả đều phải làm với loại lắp ráp bạn đã đặt trong cài đặt dự án và tham chiếu. –

+0

Đã thêm cập nhật với các tệp khác biệt của dự án. –

9

Trong thuộc tính dự án, Tab ứng dụng, Loại kết quả bạn có thể đặt thành 'Ứng dụng Windows' hoặc 'Ứng dụng giao diện điều khiển'.

Tôi tin rằng đằng sau hậu trường VS thực hiện chính xác những gì Fredrik đã trình bày trong bài đăng của anh ấy.

Ngoài ra, đặt nó vào Ứng dụng Console sẽ hiển thị cho bạn ứng dụng bảng điều khiển màu đen cho các cửa sổ Biểu mẫu dự án.

+1

Để có đầy đủ, cũng có một tùy chọn để có đầu ra cho Thư viện Lớp . – RichardOD

2

Nếu bạn nhìn vào tệp dự án (csproj), bạn sẽ thấy mục tiêu được xác định ở đó dưới dạng giao diện điều khiển hoặc ứng dụng cửa sổ.

7

Dưới nắp ca-pô, không có sự khác biệt trong winform so với bảng điều khiển exe ngoại trừ cờ trong tiêu đề PE có nội dung "Tôi cần bàn điều khiển". Tiêu đề PE không được kiểm soát từ C# của bạn (vì nó là một thứ biên dịch, không phải là một điều thời gian chạy), do đó, điều này được định nghĩa trong tệp dự án thay vào đó (<OutputType>...</OutputType>).

Hoặc tại dòng lệnh (csc /target:exe so với csc /target:winexe).

Có thể cho rằng, họ có thể đã sử dụng thuộc tính cấp độ lắp ráp mà trình biên dịch chặn - nhưng điều đó thực sự có giúp được không? Chắc là không.

+1

Cũng có liên quan: http://stackoverflow.com/questions/4866352/what-are-the-effects-of-the-pe-header-subsystem-field – jnylen

Các vấn đề liên quan