2016-06-10 26 views
6

Tôi đang viết một chương trình bàn điều khiển để chạy lịch trình tác vụ Windows. Phương thức Main() của tôi có kiểu trả về là int và tôi trả về các số khác nhau khi thoát để cho biết kết quả thực thi mà tôi có thể truy cập bằng mã số .BAT%errorlevel%.Ứng dụng giao diện điều khiển C#: Giá trị trả về phương thức chính VS Application.ExitCode

Tuy nhiên khi gỡ lỗi trong VS2015, tôi làm một

return 255; 

và tôi luôn luôn nhận được từ cửa sổ Output của VS2015:

The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0). 

Bây giờ nếu tôi muốn cửa sổ Output để hiển thị mã lối ra của chương trình của tôi, tôi phải làm một số Application.Exit(255) để hiển thị

The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff). 

Điều gì lạ là %errorlevel% được đặt chính xác thành 255 nếu tôi chạy chương trình theo số CMD.exe với câu lệnh trả về hoặc Environment.Exit().

Vì vậy, câu hỏi của tôi là

  1. là giá trị trả về của Main() hơi khác nhau để Environment.ExitCode?

  2. Cách dễ dàng tìm ra giá trị trả về của phương thức Main() trong VS2015 là gì?

  3. Khi thoát khỏi chương trình bảng điều khiển, là Environment.Exit() được ưu tiên hơn câu lệnh trả về đơn giản? Bởi vì một tuyên bố trở lại là ngắn gọn hơn với khẩu vị của tôi.

Ai đó có thể cho tôi biết câu chuyện đằng sau vấn đề này? Cảm ơn.

Trả lời

6

Giá trị trả về của Main() hơi khác với Environment.ExitCode?

Không, chúng giống nhau và đi đến cùng một vị trí. Bạn có thể thấy điều này bằng cách thử nghiệm ứng dụng bảng điều khiển chỉ trả về -1 hoặc đặt Environment.ExitCode thành -1. Bạn sẽ thấy rằng phương pháp nào bạn sử dụng hoạt động và đặt chính xác là %ERRORLEVEL%.

Cách dễ dàng tìm ra giá trị trả về của phương thức Main() trong VS2015 là gì?

Đầu tiên, nhanh chóng bỏ qua những gì dường như đang diễn ra. Đây là dấu vết ngăn xếp cho ứng dụng bảng điều khiển được tạo bằng cài đặt dự án mặc định:

TestApp.exe!TestApp.Program.Main(string[] args) 
[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) 
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() 

Lưu ý rằng quá trình lưu trữ VS ở đó.Với quá trình lưu trữ VS vô hiệu hóa stack trace (với các tùy chọn tương tự) trông như thế này:

TestApp.exe!TestApp.Program.Main(string[] args) 

Nếu bạn nhìn vào định nghĩa của ThreadHelper.ThreadStart trong reference source bạn sẽ thấy nó được định nghĩa là:

internal void ThreadStart(object obj) 

Dường như việc trả lại khoảng trống này đang được sử dụng làm giá trị trả về quá trình, hoặc một trong các phương thức khác ở trên nó tiêu thụ giá trị trả về và nuốt nó.

Nếu bạn thay đổi cấu hình dự án và vô hiệu hóa các quá trình lưu trữ sau đó bạn sẽ nhận được kết quả như sau:

The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff). 

Như bạn mong đợi. Để tắt quy trình lưu trữ, hãy chuyển đến thuộc tính dự án và trên tab gỡ lỗi, bỏ chọn "Bật quy trình lưu trữ Visual Studio"

Khi thoát khỏi chương trình bảng điều khiển, Environment.Exit() được ưu tiên hơn đơn giản return return? Bởi vì một tuyên bố trở lại là ngắn gọn hơn với khẩu vị của tôi.

Cho dù bạn thích. Như đã chỉ ra bởi Jeppe Stig trong một nhận xét, để biết thêm thông tin về sự khác biệt, hãy xem tài liệu cho Environment.Exit

+0

Xem thêm tài liệu phương pháp 'Environment.Exit (Int32)' (https://msdn.microsoft.com) /en-us/library/system.environment.exit.aspx) để biết danh sách các sự khác biệt. –

+0

@JeppeStigNielsen Điểm tốt. Đã thêm ghi chú về nó trong trường hợp bình luận của bạn biến mất. – theB

+2

* Thích * để thoát ra bằng cách trở về từ chính. Gọi 'Environment.Exit' là một hack, và không cần thiết trong một ứng dụng được thiết kế tốt. –

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