2013-02-21 19 views
18

Tôi muốn chuyển một số đối số tùy chỉnh cho ứng dụng bảng điều khiển khi tôi cài đặt và khởi động nó dưới dạng Dịch vụ Windows thông qua TopShelf.Làm cách nào để sử dụng các đối số CommandLine không được TopShelf nhận dạng?

Khi tôi sử dụng:

MyService install start /fooBar: Test 

Ứng dụng Console thất bại:

[Không] Command Line Một tùy chọn dòng lệnh không rõ đã được tìm thấy: DEFINE: foobar = Kiểm tra

Câu hỏi:

Làm cách nào để các đối số của tôi có thể nhận ra được bởi TopShelf để tôi có thể tiêu thụ các giá trị của chúng?

Trả lời

29

CHỈNH SỬA: Tính năng này chỉ hoạt động khi chạy .exe, không hoạt động khi đang chạy dưới dạng dịch vụ. Là một thay thế bạn có thể thêm các tùy chọn như một giá trị cấu hình và đọc nó lúc khởi động (đó là thực tế có lẽ tốt hơn anyway):

using System.Configuration; 

// snip 

string foobar = null; 

HostFactory.Run(configurator => 
{ 
    foobar = ConfigurationManager.AppSettings["foobar"]; 

    // do something with fooBar 

    configurator.Service<ServiceClass>(settings => 
    { 
     settings.ConstructUsing(s => GetInstance<ServiceClass>()); 
     settings.WhenStarted(s => s.Start()); 
     settings.WhenStopped(s => s.Stop()); 
    }); 

    configurator.RunAsLocalService(); 
    configurator.SetServiceName("ServiceName"); 
    configurator.SetDisplayName("DisplayName"); 
    configurator.SetDescription("Description"); 
    configurator.StartAutomatically(); 
}); 

Theo tài liệu bạn cần phải xác định các lệnh trong này mẫu:

-foobar:Test 

bạn cũng cần phải thêm định nghĩa trong cấu hình dịch vụ của bạn:

string fooBar = null; 

HostFactory.Run(configurator => 
{ 
    configurator.AddCommandLineDefinition("fooBar", f=> { fooBar = f; }); 
    configurator.ApplyCommandLine(); 

    // do something with fooBar 

    configurator.Service<ServiceClass>(settings => 
    { 
     settings.ConstructUsing(s => GetInstance<ServiceClass>()); 
     settings.WhenStarted(s => s.Start()); 
     settings.WhenStopped(s => s.Stop()); 
    }); 

    configurator.RunAsLocalService(); 
    configurator.SetServiceName("ServiceName"); 
    configurator.SetDisplayName("DisplayName"); 
    configurator.SetDescription("Description"); 
    configurator.StartAutomatically(); 
}); 
+3

Sau khi AddCommandLineDefinition() và trước khi // làm điều gì đó bạn cần thêm dòng sau: cấu hình.ApplyCommandLine(); – Todd

+1

Bạn có thể thêm đối số dòng lệnh vào ServiceClass không? Tôi đang cố gắng làm điều đó, nhưng nó sẽ không hoạt động khi tôi bắt đầu nó như một dịch vụ. – fuLLMetaLMan

+0

Có. Điều này không hoạt động khi cài đặt/khởi động nó như dịch vụ. foobar trống. @fuLLMetaLMan: Bạn có tìm thấy câu trả lời không? –