2009-05-07 20 views
21

Tôi đã tạo một dịch vụ Windows trong C#, cài đặt nó trên một máy chủ và nó đang chạy tốt.Làm cách nào để định cấu hình tên của dịch vụ Windows khi cài đặt (hoặc dễ dàng trong thời gian biên dịch)?

Bây giờ tôi muốn cài đặt lại cùng một dịch vụ, nhưng chạy từ một thư mục làm việc khác, có tệp cấu hình khác. V.v. Do đó, tôi muốn có hai (hoặc nhiều hơn) phiên bản của cùng một dịch vụ đang chạy đồng thời . Ban đầu, điều này là không thể vì trình cài đặt sẽ phàn nàn rằng đã có dịch vụ với tên đã được cài đặt.

Tôi có thể khắc phục điều này bằng cách thay đổi mã của tôi, đặt thuộc tính ServiceBase.ServiceName thành giá trị mới, sau đó biên dịch lại và chạy lại InstallUtil.exe. Tuy nhiên, tôi rất muốn nếu tôi có thể thiết lập tên dịch vụ tại cài đặt thời gian, tức là lý tưởng tôi sẽ làm một cái gì đó giống như

InstallUtil.exe/i /servicename = "MyService Instance 2" MyService.exe

Nếu điều này không thể thực hiện được (tôi rất nghi ngờ nó), tôi muốn có thể tiêm tên dịch vụ khi tôi xây dựng dịch vụ. Tôi nghĩ rằng nó có thể có thể sử dụng một số loại xây dựng sự kiện, sử dụng một msbuild thông minh hoặc nant trick hoặc một cái gì đó dọc theo những dòng, nhưng tôi đã không có một đầu mối.

Mọi đề xuất sẽ được đánh giá rất nhiều.

Cảm ơn bạn đã dành thời gian.

+1

Có lý do nào khiến bạn không cung cấp dịch vụ của mình khả năng thực thi logic nghiệp vụ trong các chủ đề n cho các tệp n-config không? Vì vậy, lưu các vấn đề nhiều trường hợp từ đầu? – Nate

+0

Hmmm, đó có thể là một điểm tốt. Nhưng dịch vụ đã được tạo ra cách đây một năm, trước khi tôi nhận ra rằng tôi muốn có thể chạy nhiều phiên bản, vì vậy ứng dụng không thực sự được cấu trúc một cách thích hợp. Tuy nhiên, tôi đã tìm thấy một giải pháp và sẽ đăng nó trong giây lát. – Rune

Trả lời

28

tôi đã cố gắng truy cập vào một cấu hình sử dụng

ConfigurationManager.OpenExeConfiguration(string exePath) 

trong trình cài đặt, nhưng không thể làm cho nó làm việc.

Thay vào đó tôi quyết định sử dụng System.Environment.GetCommandLineArgs() trong bộ cài đặt như thế này:

string[] commandlineArgs = Environment.GetCommandLineArgs(); 

string servicename; 
string servicedisplayname; 
ParseServiceNameSwitches(
    commandlineArgs, 
    out servicename, 
    out servicedisplayname); 

serviceInstaller.ServiceName = servicename; 
serviceInstaller.DisplayName = servicedisplayname; 

Bây giờ tôi có thể cài đặt các dịch vụ của tôi sử dụng

InstallUtil.exe/i InstallableService.dll /servicename =" myserviceinstance_2 " /servicedisplayname =" Dịch vụ của tôi Ví dụ 2 "

Tôi đã viết một lời giải thích phức tạp hơn here.

+0

Nhìn vào câu hỏi và câu trả lời để có được giải pháp hoàn hảo cho việc này: http://stackoverflow.com/questions/ 8516701/how-to-get-windows-dịch vụ-tên-từ-app-config – techExplorer

4

Bạn không thể truyền điều này dưới dạng dòng lệnh arg, vì InstallUtil không cung cấp móc phù hợp cho điều đó.

Tuy nhiên, bạn có thể làm cho trình cài đặt dịch vụ của bạn đọc ServiceName từ tệp cấu hình. Nếu bạn look at some code cho một ServiceInstaller điển hình, bạn sẽ thấy nó chỉ là vấn đề có thiết lập thuộc tính DisplayName và ServiceName thích hợp khi chạy. Đây có thể dễ dàng được đọc từ một tập tin cấu hình thay vì được mã hóa cứng.

+0

Thật sao? Tôi đã thử đọc các giá trị này từ tệp ServiceExeName.config trong khi cài đặt dịch vụ windows và nó không hoạt động: ( – Darragh

2

Thay vì sử dụng Environment.GetCommandLineArgs(); lớp Installer có thuộc tính được gọi là Context mà từ đó bạn có thể truy cập đối số dòng lệnh được chuyển đến InstallUtil được cấu trúc trong một số đẹp StringDictionary.

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