2009-07-28 24 views

答えて

7

installutilを使用できます。コマンドラインから

installutil YourWinService.exe 

このユーティリティは、.NET Frameworkの

+0

、私はあなたがまだサービスの設定で動作するようにます。installutilため、プロジェクトでインストーラを作成する必要があると考えていますプロパティ: http://www.developer.com/net/net/article.php/11087_2173801_2 –

+2

Danは正しいですが、インストーラを作成する必要があります。 scコマンド(下記参照)は、インストーラを必要とせずにWindowsサービスのインストール/削除/起動/停止などを可能にします(これはどういうわけか、質問の核心です)。 インストーラに焼き付けられたサービスメタデータ(スタートアップの種類、アカウント名、再起動のプロパティなど)の多くを外部に保存できるので便利です。これは、再コンパイルを必要としないため、MSBuildやNantなど、展開用のスクリプトと組み合わせて使用​​すると二重に役立ちます。 これは、C#、C、C++で書かれているかどうかをインストールすることもできます。 –

+1

「インストーラ」クラスが必要ですが、setup.exeの意味でのインストーラはありません – Nathan

8

あなたが試みることができると一緒にインストールされているWindows sc command

C:\WINDOWS\system32>sc create

説明: SC commuで使用されるコマンドラインプログラムですNT Service Controllerおよびサービスと結びついています。

8

私にはインストールを行うクラスが含まれています。私はアプリケーションをインストールまたはアンインストールするコマンドラインパラメータを使用してアプリケーションを呼び出します。また、以前はコマンドラインから直接起動したときにサービスをインストールするかどうかをユーザーに知らせるメッセージを表示していました。ここで

は、私が使用するクラスです:

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); 
     } 
    } 
} 

そして、ここでは、私はそれを呼び出す方法は次のとおりです。

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

これは魅力的です。とても便利な。投稿ありがとう! –

関連する問題