2009-05-07 34 views
20

Cách chính xác để triển khai và kiến ​​trúc một công cụ dòng lệnh như một ứng dụng giao diện điều khiển C# là gì?Cách đúng để triển khai ứng dụng giao diện điều khiển C#?

Mối quan tâm đến địa chỉ bao gồm phân tích cú pháp đúng các biến dòng lệnh và cách thích hợp để xuất văn bản. Trong khi Console.WriteLine() là sự lựa chọn rõ ràng nhất cho đầu ra, các trường hợp mà trong đó một trong những thay vào đó nên lựa chọn để ghi vào dòng lỗi tiêu chuẩn, .Error, .SetErrorStream, vv?

Cách thích hợp để ứng dụng thoát ra khi trả về mã trả về thích hợp cho lệnh gọi?

Sự kiện CancelKeyPress sẽ được thực hiện như thế nào để làm gián đoạn chương trình? Nó chỉ được sử dụng khi một hoạt động không đồng bộ xảy ra trên một luồng riêng biệt?

Có hướng dẫn ngắn gọn về lập trình công cụ dòng lệnh trong C# hay thậm chí tốt hơn dự án hoặc mẫu nguồn mở mà tôi có thể sử dụng để triển khai đúng công cụ tương đối đơn giản không?

+0

dupe? Xem tại đây: http://stackoverflow.com/questions/817673/architectural-considerations-in-designing-console-applications –

+0

Xem thêm: http://stackoverflow.com/questions/664533/best-command-line-option- parsers-for-cc-and-c-closed –

+1

Câu hỏi của tôi là khám phá rộng hơn về cơ chế ứng dụng .NET console - bao gồm cả cách sử dụng đúng các sự kiện ErrorStream và CancelKeyPress. Hai bài viết đó liên quan cụ thể đến phân tích cú pháp dòng lệnh và cấu trúc lớp, tương ứng. – James

Trả lời

25

Thông báo lỗi phải được ghi vào stderr hay còn gọi là Console.Error, và đầu ra bình thường để stdout aka Console.Out. Điều này đặc biệt quan trọng đối với các ứng dụng bảng điều khiển kiểu "bộ lọc" có đầu ra (stdout) có thể được dẫn tới một quy trình khác, ví dụ: trong một tập tin thực thi.

Nói chung nếu bạn gặp phải lỗi, hãy viết thông báo lỗi cho Console.Error và trả về kết quả khác 0. Hoặc nếu đó là một ngoại lệ, chỉ cần không bận tâm xử lý nó.

Để trả lại mã kết quả, bạn có thể chuyển nó làm đối số cho Environment.Exit, đặt thuộc tính Environment.ExitCode hoặc trả về giá trị khác 0 từ chính.

Đối với các ứng dụng giao diện điều khiển đơn giản, tôi sẽ:

  • có một lớp helper để phân tích dòng lệnh.

  • có lớp mặt tiền cung cấp API có thể kiểm tra cho chức năng được công cụ dòng lệnh của bạn triển khai. Giống như hầu hết các API .NET, điều này thường sẽ ném một ngoại lệ nếu xảy ra lỗi.

  • chương trình chính chỉ sử dụng trình trợ giúp để phân tích cú pháp dòng lệnh và gọi API truyền các đối số được truyền từ dòng lệnh. Nó tùy chọn bắt các ngoại lệ được ném ra khỏi API, ghi lại chúng, viết một thông báo lỗi hướng đến người dùng tới Console.Error và thiết lập một mã trả về khác không.

Nhưng tôi wouln't coi đây là một trong những cách đúng: không có thực sự là một điều như vậy đó là lý do bạn khó có thể tìm thấy cuốn sách mà bạn đang tìm kiếm.

2

Đối với đối số dòng lệnh, bạn sẽ tìm thấy các chương trình khác nhau, nhưng tôi đã luôn luôn là một fan hâm mộ của

app.exe "self-explanatory arg" /noArgumentSwitch /argumentSwitch="argument" 

Đối với các mã trở lại, bạn có thể thay đổi chữ ký của chức năng Main() của bạn để trở an int thay vì void. Điều này sẽ cho phép bạn trả lại mã cho quá trình gọi, nếu cần.

Đối với luồng lỗi, tôi chưa bao giờ cá nhân sử dụng nó và tôi không nghĩ rằng nó nên đến với chi phí xuất thông tin lỗi trong luồng đầu ra tiêu chuẩn. Nó có thể được sử dụng tốt hơn cho thông tin gỡ rối lỗi cụ thể.

5

Về cách triển khai phân tích cú pháp lệnh, tôi đã sử dụng thành công sự phản ánh và đại biểu trước đây. Họ cách nó hoạt động là để trang trí các phương pháp lệnh với một thuộc tính đặc biệt bạn làm cho mình mà khẳng định phương pháp này nên được người dùng invokable, hoặc thông qua tên của phương pháp hoặc một chuỗi quy định tại các thuộc tính, ví dụ:

[Command("quit")] 
public void QuitApp() 
{ 
    ... 
} 

Mở chương trình khởi động bạn có thể quét một lớp cho các phương thức như vậy, và lưu trữ các đại biểu nhắm mục tiêu chúng trong một từ điển mà các phím là các lệnh. Điều này giúp dễ dàng phân tích cú pháp lệnh dựa trên tra cứu từ đầu tiên trong từ điển (được phân bổ O (1)) và dễ dàng mở rộng và có thể bảo trì được trong tương lai, vì các lệnh mới được thêm vào chỉ đơn giản là thêm các phương thức riêng biệt.

2

Để xử lý dòng lệnh, hãy xem Mono.GetOptions. Nó làm cho nó dễ dàng để cư các biến từ các tùy chọn dòng lệnh ngắn (-f style) và dài (--file style).

0

Tôi đã chọn viết một số ứng dụng tiện ích bảng điều khiển dưới dạng ứng dụng biểu mẫu cửa sổ thay vì ứng dụng giao diện điều khiển. Nói chung, tôi thêm một bộ đếm thời gian để trì hoãn khởi động ban đầu và chỉ cần thêm nút hủy có đồng hồ đo tiến độ - do đó cho phép tùy chọn hủy trực quan hơn. Bạn vẫn có thể xuất ra giao diện điều khiển theo cách đó.

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