2009-07-28 41 views

Trả lời

7

Bạn có thể sử dụng installutil.

Từ dòng lệnh:

installutil YourWinService.exe 

Tiện ích này được cài đặt với .NET Framework

+0

Tôi tin rằng bạn vẫn cần phải tạo ra một trình cài đặt trong dự án của bạn cho installutil để làm việc với cấu hình của dịch vụ các thuộc tính: http://www.developer.com/net/net/article.php/11087_2173801_2 –

+2

Dan đúng, bạn vẫn cần phải tạo trình cài đặt. Lệnh sc (xem bên dưới) sẽ cho phép bạn cài đặt/xóa/bắt đầu/dừng, vv một dịch vụ Windows mà không yêu cầu trình cài đặt (dường như, với tôi, cốt lõi của câu hỏi). Điều này rất tiện lợi vì phần lớn siêu dữ liệu dịch vụ (loại khởi động, tên tài khoản, thuộc tính khởi động lại, v.v.) được đưa vào trình cài đặt có thể được lưu trữ bên ngoài. Điều này là hữu ích gấp đôi khi kết hợp với các kịch bản để triển khai, nói MSBuild hoặc Nant, bởi vì nó không yêu cầu biên dịch lại. Nó cũng có nghĩa là bạn có thể cài đặt cho dù nó được viết bằng C#, C, C++. –

+1

Bạn cần một lớp 'Trình cài đặt', nhưng không phải là trình cài đặt theo nghĩa là setup.exe – Nathan

8

Bạn có thể thử các cửa sổ sc command

C:\WINDOWS\system32>sc create

MÔ TẢ: SC là một chương trình dòng lệnh được sử dụng cho commu rất thích thú với Bộ điều khiển và dịch vụ NT.

8

Tôi bao gồm lớp học cài đặt cho tôi. Tôi gọi ứng dụng bằng các tham số dòng lệnh để cài đặt hoặc gỡ cài đặt ứng dụng. Tôi cũng có trong quá khứ bao gồm một dấu nhắc cho người dùng cho dù họ muốn các dịch vụ được cài đặt khi bắt đầu trực tiếp từ dòng lệnh.

Đây là lớp tôi sử dụng:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 
using Microsoft.Win32; 

namespace [your namespace here] 
{ 
    class IntegratedServiceInstaller 
    { 
     public void Install(String ServiceName, String DisplayName, String Description, 
      System.ServiceProcess.ServiceAccount Account, 
      System.ServiceProcess.ServiceStartMode StartMode) 
     { 
      System.ServiceProcess.ServiceProcessInstaller ProcessInstaller = new System.ServiceProcess.ServiceProcessInstaller(); 
      ProcessInstaller.Account = Account; 

      System.ServiceProcess.ServiceInstaller SINST = new System.ServiceProcess.ServiceInstaller(); 

      System.Configuration.Install.InstallContext Context = new System.Configuration.Install.InstallContext(); 
      string processPath = Process.GetCurrentProcess().MainModule.FileName; 
      if (processPath != null && processPath.Length > 0) 
      { 
       System.IO.FileInfo fi = new System.IO.FileInfo(processPath); 
       //Context = new System.Configuration.Install.InstallContext(); 
       //Context.Parameters.Add("assemblyPath", fi.FullName); 
       //Context.Parameters.Add("startParameters", "Test"); 

       String path = String.Format("/assemblypath={0}", fi.FullName); 
       String[] cmdline = { path }; 
       Context = new System.Configuration.Install.InstallContext("", cmdline); 
      } 

      SINST.Context = Context; 
       SINST.DisplayName = DisplayName; 
       SINST.Description = Description; 
       SINST.ServiceName = ServiceName; 
      SINST.StartType = StartMode; 
      SINST.Parent = ProcessInstaller; 

      // http://bytes.com/forum/thread527221.html 
//   SINST.ServicesDependedOn = new String[] {}; 

      System.Collections.Specialized.ListDictionary state = new System.Collections.Specialized.ListDictionary(); 
      SINST.Install(state); 

      // http://www.dotnet247.com/247reference/msgs/43/219565.aspx 
      using (RegistryKey oKey = Registry.LocalMachine.OpenSubKey(String.Format(@"SYSTEM\CurrentControlSet\Services\{0}", SINST.ServiceName), true)) 
      { 
       try 
       { 
        Object sValue = oKey.GetValue("ImagePath"); 
        oKey.SetValue("ImagePath", sValue); 
       } 
       catch (Exception Ex) 
       { 
//     System.Console.WriteLine(Ex.Message); 
       } 
      } 

     } 
     public void Uninstall(String ServiceName) 
     { 
      System.ServiceProcess.ServiceInstaller SINST = new System.ServiceProcess.ServiceInstaller(); 

      System.Configuration.Install.InstallContext Context = new System.Configuration.Install.InstallContext("c:\\install.log", null); 
      SINST.Context = Context; 
       SINST.ServiceName = ServiceName; 
      SINST.Uninstall(null); 
     } 
    } 
} 

Và dưới đây là cách tôi gọi nó là:

const string serviceName = "service_name"; 
const string serviceTitle = "Service Title For Services Control Panel Applet"; 
const string serviceDescription = "A longer description of what the service does. This is used by the services control panel applet"; 
// Install 
IntegratedServiceInstaller Inst = new IntegratedServiceInstaller(); 
Inst.Install(serviceName, serviceTitle, serviceDescription, 
    // System.ServiceProcess.ServiceAccount.LocalService,  // this is more secure, but only available in XP and above and WS-2003 and above 
    System.ServiceProcess.ServiceAccount.LocalSystem,  // this is required for WS-2000 
    System.ServiceProcess.ServiceStartMode.Automatic); 
// Uninstall 
IntegratedServiceInstaller Inst = new IntegratedServiceInstaller(); 
Inst.Uninstall(serviceName); 
+0

Điều này hoạt động giống như một sự quyến rũ. Rất tiện dụng. Cảm ơn vì đăng! –

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