2009-04-13 38 views
16

Có cách nào đơn giản để thư viện mã tự động phát hiện nếu nó đang được gọi từ ứng dụng bảng điều khiển hoặc ứng dụng cửa sổ? Tôi muốn thư viện của tôi không báo cáo cho bản ghi sự kiện Windows nếu nó được gọi từ cửa sổ bảng điều khiển, nhưng thay vào đó hãy báo cáo đến cửa sổ bảng điều khiển. Tuy nhiên, nếu nó không được chạy từ bên trong cửa sổ bảng điều khiển, nó sẽ báo cáo cho Nhật ký sự kiện Windows.Làm thế nào để phát hiện nếu tôi đang chạy trong bảng điều khiển

Tôi nghĩ về việc yêu cầu thành phần ghi nhật ký của mình được chuyển qua mục tiêu nhật ký, nhưng nó sẽ gọn gàng nếu nó có thể tự động xử lý hai mục tiêu này một cách tự nhiên. Tôi vẫn chưa yêu cầu một thứ gì đó rộng rãi như log4net, nếu cần thiết để cung cấp hỗ trợ để đăng nhập vào cơ sở dữ liệu/tệp và các mục tiêu đăng nhập chưa biết, thì tôi có thể đề xuất giải pháp như vậy. Bây giờ, mặc dù chỉ có thành phần của tôi tự động phát hiện môi trường và đăng nhập vào bàn điều khiển hoặc bản ghi sự kiện theo môi trường sẽ rất nhiều.

Trả lời

8

Kiến trúc, chuyển ngữ cảnh khai thác vào thành phần thư viện là lựa chọn đúng đắn. Thư viện không, và thực sự không nên, biết rằng nhiều bối cảnh về môi trường nó đang được chạy.

Vì bạn muốn hỗ trợ hai trường hợp đặc biệt này trong thư viện, tôi đề xuất một cách tiếp cận thống nhất.

  1. Hãy tiếp tục và tạo điểm/nút nhập nhật ký tổng quát hơn mà người gọi kiểm soát.
  2. Tạo một điểm/núm nhập riêng biệt tự động đặt một điểm/núm nhập chung cho các trường hợp bạn muốn tự động hỗ trợ.

Mặc dù điều này có vẻ quá phức tạp dựa trên mô tả của bạn. Bạn đã xem xét việc sử dụng TraceListeners thích hợp trong bộ sưu tập Chẩn đoán, nơi ứng dụng giao diện điều khiển của bạn thêm TraceListener thích hợp để xuất ra bàn điều khiển và ứng dụng không phải bàn điều khiển sẽ thêm EventLog TraceListener thích hợp vào đầu ghi sự kiện Windows không? Điều này có lợi thế bổ sung khi làm việc tốt với tất cả hỗ trợ ghi nhật ký mạng được tích hợp sẵn mà không giả định bất kỳ phụ thuộc bên ngoài nào (ví dụ: log4net).

+0

Thành thật mà nói, tôi đã không thực sự thực hiện nhiều thử nghiệm trong cách ghi nhật ký trước đó. Trên thực tế, tôi chỉ cần đăng nhập vào một trong số ít địa điểm được xác định trước. Do đó tôi chưa bao giờ thử nghiệm với TraceListeners ... sắp sửa thay đổi. Cảm ơn, +1 – BenAlabaster

+0

Thỏa thuận tốt, vui vì tôi có thể trợ giúp! Quy tắc TraceListeners. : D –

1

Các biến thể của câu hỏi này đã được hỏi trước đây. Cụ thể là herehere.

' Các giải pháp dường như đun sôi xuống để hai lựa chọn

  • Sử dụng phản xạ để tìm ra những gì đang gọi bạn.
  • Trong trường hợp ứng dụng giao diện điều khiển thực hiện cuộc gọi đến bàn điều khiển trong khối try-catch và xem nó có bị lỗi hay không thành công.

Đề xuất của riêng tôi là để thư viện xuất một giao diện. Giao diện có một hàm hoặc thuộc tính trả về kiểu của người gọi. Đối tượng gọi có một lớp thực hiện giao diện và trả về kiểu đó. Bởi vì phức tạp là một mối quan tâm bạn có thể kiểm soát mà phần nào bởi những gì bạn đặt trong giao diện.

Nếu ứng dụng không tự đăng ký với thư viện thì bạn có thể thử phát hiện lỗi hoặc thử một số sơ đồ phát hiện tự động.

Bằng cách sử dụng giao diện và đưa ra lỗi, bạn đang làm cho nó rõ ràng với người lập trình bằng cách sử dụng thư viện chính xác những gì bạn mong đợi. Sự tương tác giữa hai được xác định bởi giao diện.

Ngoài ra, sự tương tác linh hoạt hơn so với chương trình tự động vì tôi là người dùng, hãy chọn cách nhị phân gọi điện tương tác với thư viện của bạn thay vì một số quy tắc bí ẩn.

0

Tôi biết đó là loại hack, nhưng gọi Console.Read sẽ ném một ngoại lệ khi không có bảng điều khiển.

bool isConsole = true; 
try 
{ 
    isconsole = Console.CursorLeft >= int.MinValue; 
} 
catch(IOException) 
{ 
    // Try to attach to parent process's console window 
    isConsole = AttachConsole(0xFFFFFFFF); 
} 

... 

[DllImport("kernel32", SetLastError = true)] 
private static extern bool AttachConsole(uint dwProcessId); 

Đây là một tác dụng phụ nên nó có thể không phải là phương pháp phát hiện đáng tin cậy, nhưng nó hoạt động ngay bây giờ.

+1

Nó cũng sẽ yêu cầu người dùng nhập một ký tự rác trước khi chạy nó sẽ không? Tôi tự hỏi nếu một phương pháp điều khiển tĩnh khác sẽ không có ảnh hưởng tương tự, mà không có sự tương tác của người dùng. –

6

Chỉ phát hiện ra rằng "Console.Title" sẽ là một chuỗi trống trong ứng dụng cửa sổ và nó sẽ được tự động đặt trong ứng dụng bảng điều khiển.

Tuy nhiên, một bản hack vẫn còn.

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