2009-12-30 54 views
5

Tôi đã tạo và khởi động dịch vụ windows Service1 (với exe là MyService.exe) bằng C# 2005.. Tôi đã bao gồm một phương thức GetMyRandomNumber() trả về một giá trị kép ngẫu nhiên.Cách gọi phương thức chạy dịch vụ windows

Sự cố ở đây là cách sử dụng dịch vụ đang chạy này và cách tôi có thể gọi phương thức.

Tôi đã thử thêm tài liệu tham khảo của MyService.exe và truy cập các phương pháp như -

Service1 s = new Service1(); 
MessageBox.Show(s.GetMyRandomNumber().ToString()); 

Nhưng thấy rằng phương pháp này không được gọi từ các trường hợp chạy của dịch vụ tức là mặc dù tôi dừng dịch vụ báo cáo được thực hiện.

Ai đó có thể giải thích cho tôi làm cách nào tôi có thể gọi phương thức chạy phiên bản dịch vụ.

Cảm ơn bạn đã chia sẻ thời gian quý báu của mình.

Trả lời

14

Trong code của bạn, bạn không thực sự gọi dịch vụ, thay vì bạn đang tham chiếu đến tệp thực thi và invok ing một phương thức từ assembly đó (tại thời điểm chạy .NET Framework sẽ sử dụng assembly cục bộ để thực thi mã, không phải dịch vụ đang chạy của bạn).

Để thực hiện những gì bạn muốn, bạn có một số tùy chọn.

Trong .NET 2.0, bạn sẽ sử dụng .NET Remoting. Bạn tạo một giao diện truy cập từ xa, mà các assembly khác có thể sử dụng để gọi các phương thức trên các tệp thực thi.

Trong .NET 3.0, từ xa đã được thay thế bằng WCF. Dịch vụ của bạn sẽ trở thành một dịch vụ WCF, nó sẽ trưng ra GetRandomNumber() như là một phần của hợp đồng dữ liệu của nó. Ứng dụng có thể tiêu thụ hợp đồng và kết nối với dịch vụ của bạn để gọi phương thức.

Có một số hướng dẫn tốt trên web cho cả .NET Remoting hoặc thay thế của nó, Windows Communication Foundation.

+2

+1 WCF sẽ là lựa chọn đúng trong trường hợp này nếu trên .NET 3.0+. Để hoàn thiện vì tôi muốn thêm rằng mặc dù WCF thay thế Remoting trong hầu hết các trường hợp, nó vẫn có một niche cho cross-AppDomain thông tin liên lạc - Tôi sẽ không sử dụng WCF để giao tiếp trên AppDomain ranh giới, nhưng trong tất cả các trường hợp khác, WCF là sự lựa chọn đúng. –

2

Giao tiếp với dịch vụ đang chạy không khác với cách gọi phương thức trên bất kỳ quy trình đang chạy nào khác. Điều đó có nghĩa là bạn sẽ cần phải đào các công cụ tiêu chuẩn của bạn để liên lạc quá trình xử lý.

Windows Communication Foundation (WCF) sẽ là lựa chọn mặc định của tôi. Bạn có thể lưu trữ một dịch vụ WCF trong Dịch vụ Windows của bạn và hiển thị nó thông qua một điểm cuối tên đã đặt tên để giao tiếp hiệu quả.

2

WCF sẽ là quá mức cần thiết để liên lạc trên cùng một máy tính. Pipes là giải pháp đơn giản và hiệu quả hơn.

+1

WCF có thể sử dụng các đường ống có tên. http://msdn.microsoft.com/en-us/library/ms733769.aspx –

+2

Anh ấy đang sử dụng C# 2005 (.Net 2.0?) vì vậy WCF không phải là một tùy chọn. – Giorgi

+1

Quan sát tốt. Tôi đã không nhận ra điều đó. –

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