2010-02-11 35 views
11

Tôi đã viết một dịch vụ Windows, trong đó tôi muốn có 1 cá thể chạy trên mỗi khách hàng. Điều này là do mỗi khách hàng có DB của riêng họ với các lược đồ giống hệt nhau; sự khác biệt duy nhất giữa các dịch vụ Windows là chúng sẽ có một tham số khác nhau tương ứng với DB khách hàng mà chúng được chỉ định để phân phối. (Và tôi không thể có một dịch vụ với nhiều chuỗi công nhân, bởi vì kết nối DB sử dụng một biến tĩnh, mà tôi không thể fiddle với qua chủ đề.)Cách tạo dịch vụ Windows với các tham số?

Tôi tìm thấy this neat little tutorial về cách tạo một Dịch vụ Windows, nhưng nó chỉ cho tôi thấy cách thiết lập nó cho một dịch vụ duy nhất. Tôi muốn thiết lập n phiên bản dịch vụ, mỗi trường có tên hiển thị bao gồm tên khách hàng, chạy với thông số dòng lệnh biểu thị ID khách hàng. Hướng dẫn được liên kết ở trên có một lớp được gọi là MyWindowsServiceInstaller, cài đặt dịch vụ cửa sổ trên hệ thống cục bộ và tôi đoán đây sẽ là nơi hợp lý để thiết lập vòng lặp foreach thông qua tất cả khách hàng của tôi, thiết lập một dịch vụ cho mỗi. Nhưng tôi không thể nhìn thấy bất cứ nơi nào trên các giao diện được cung cấp mà sẽ cho phép tôi thiết lập một tham số dòng lệnh cho dịch vụ mới.

Bạn làm như thế nào?

+0

tôi loại bỏ câu trả lời của tôi, có folks ra có mà biết thêm về điều này hơn tôi. –

+0

@ Binary Worrier - Tôi ước bạn đã không xóa câu trả lời của bạn! Có một số ý tưởng trong đó rất hứa hẹn ... –

+0

Trả lời chưa được xóa: Tôi đã đánh dấu nó là CW, không đầy đủ, chúng tôi có một trang cheat ở đâu đó với hướng dẫn "cách" để có được một vài phiên bản của cùng một dịch vụ đang chạy, nhưng Tôi không thể tìm thấy nó và không có thời gian để đào, xin lỗi Shaul. –

Trả lời

7

Wil Peck wrote a good article về cách cài đặt nhiều bản sao dịch vụ cửa sổ trên một hộp.Ý tưởng cơ bản là bạn phải lừa trình cài đặt để nghĩ rằng chúng là các dịch vụ khác nhau bằng cách đặt cho chúng các tên khác nhau.

Có nói rằng, có vẻ như sẽ dễ dàng hơn (và dễ bảo trì hơn) để thiết kế lại mã kết nối cơ sở dữ liệu của bạn để nó có thể hỗ trợ nhiều chuỗi công việc.

+1

+1 cho liên kết, +1 một lần nữa nếu tôi có thể cho lời khuyên để có một số chuỗi công nhân trong một dịch vụ. Bạn luôn có thể có một GUI điều khiển từ xa đến dịch vụ và hiển thị thông tin về các luồng đang chạy. –

+0

Yup, Wil có câu trả lời. Cảm ơn một tấn cho con trỏ! –

1

Về cơ bản, bạn cần phải cài đặt dịch vụ nhiều lần và tùy chỉnh nó với tệp exe.config của nó.

Hoặc, bạn có thể có một dịch vụ chạy các chuỗi công nhân khác nhau cho từng khách hàng.

Cập nhật

exe.Config là một Application Configuration File

Tôi không có ý tưởng làm thế nào để sử dụng mà thành phần cài đặt để cài đặt một số trường hợp của dịch vụ, tôi không biết bạn có thể.

Trường hợp chúng tôi cần một vài trường hợp dịch vụ của chúng tôi chạy trên một máy, chúng tôi thực sự chỉ cài đặt một lần, sau đó sao chép thư mục đã cài đặt và đổi tên exe cho phiên bản thứ hai. Ví dụ thứ hai sau đó được cấu hình trong tệp cấu hình ứng dụng riêng của nó.

+0

Trong hướng dẫn tôi đã liên kết ở trên, có một lớp được gọi là MyWindowsServiceInstaller, cài đặt nào hoạt động. Có vẻ như đó sẽ là nơi để thiết lập vòng lặp cho tất cả khách hàng - nhưng tôi không thể thấy ở bất kỳ đâu để thiết lập tham số dòng lệnh cho từng dịch vụ. Làm thế nào để bạn thiết lập các tham số? và tha thứ cho sự thiếu hiểu biết của tôi, nhưng exe.config là gì? –

+0

đã cập nhật câu hỏi của tôi để làm rõ một số điểm bạn đã đề cập. –

+0

+1 cho liên kết tới Tệp Cấu hình Ứng dụng –

1

Theo như tôi biết, không thể cung cấp thông số khởi động bằng cách sử dụng ServiceInstaller, ServiceProcessInstaller hoặc installutil. Tuy nhiên, có thể cung cấp các tham số khởi động bằng cách sử dụng một số COM api từ advapi.dll (kiểm tra menu bên trái). Bạn có thể tìm thấy bộ sưu tập đầy đủ các cuộc gọi yêu cầu here. Đó là một lớp (cũng) được gọi là ServiceInstaller có chứa các phương thức bên ngoài bắt buộc và một số phương thức tiện ích.

Bạn muốn sử dụng phương pháp tiện ích InstallAndStart. Nó chấp nhận tên dịch vụ, tên hiển thị và đường dẫn đến tệp thực thi đại diện cho dịch vụ Windows của bạn. Bạn có thể gọi nó như thế này:

InstallAndStart("MyService", "My Service For User 1", 
       "c:\\pathtoexe\MyService.exe user1"); 

Nếu bạn có dịch vụ sau tham số startupParam sẽ nhận được giá trị user1.

class Program : ServiceBase 
{ 
    private string startupParam; 

    static void Main(string[] args) 
    { 
     string arg = args[0]; 
     ServiceBase.Run(new Program(arg)); 
    } 

    public Program(string startupParam) 
    { 
     this.ServiceName = "MyService"; 
     this.startupParam = startupParam; 
    } 
    ... 
} 
+0

ummm ... vừa thử điều này và có vẻ như installutil không cho phép bạn chuyển các tham số ...? Tui bỏ lỡ điều gì vậy? –

+0

Hm, có vẻ như tôi không chính xác. Xin lỗi vì điều đó và quên đi phần installutil. Tôi sử dụng một lớp ServiceInstaller tùy chỉnh bản thân mình sử dụng COM api để bắt đầu và ngừng dịch vụ. Lớp này cho phép truyền các tham số và tôi nghĩ installutil sẽ làm như vậy. Tôi sẽ cập nhật câu trả lời của mình ... –

+0

Ronald, tôi có một khách hàng cần Dịch vụ Windows để thực hiện các hành động trên hệ thống bằng tài khoản SYSTEM, vì khách hàng của tôi không có quyền. Nếu tôi muốn khách hàng yêu cầu Dịch vụ Windows phải làm gì, tôi có nên dừng lại và bắt đầu mỗi lần, bằng cách chuyển các đối số như thế này? Tôi tìm thấy tính năng OnCustomCommand, nhưng nó không hữu ích bởi vì bạn chỉ có thể vượt qua số nguyên. Hoặc tôi có nên sử dụng cơ sở dữ liệu hoặc khóa đăng ký để đặt đối số tạm thời dựa trên máy khách đang chạy không? – MacGyver

-2

Nếu sử dụng các công cụ của bên thứ ba là phù hợp với bạn, hãy thử http://installer.codeeffects.com. Chúng cho phép bạn xây dựng một trình cài đặt .exe cho dịch vụ Windows của bạn và thêm các tham số vào giao diện người dùng của trình cài đặt. Ngoài ra, bạn không cần phải phát triển dự án thiết lập của riêng bạn. Hi vọng điêu nay co ich.

+0

$ ping installer.codeeffects.com ping: không thể giải quyết installer.codeeffects.com: Máy chủ không xác định – harperville

12

Tất cả những gì tôi muốn là gửi một tham số đến dịch vụ mà tôi đã tạo. Khi nó quay ra, tất cả những gì bạn phải làm là (cẩn thận!) Chỉnh sửa registry tại HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ và thêm tham số trong ImagePath, sau dấu ngoặc kép.

Ví dụ: ImagePath Value Data: "C: \ Program Files \ MyService \ myservice.exe" param1

Tôi tìm thấy giải pháp trong liên kết này http://social.msdn.microsoft.com/Forums/is/csharpgeneral/thread/38242afa-7e40-4c06-975e-aa97d3cc782f

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