問題:windows服務安裝時,出錯:System.ComponentModel.Win32Exception: 帳戶名稱無效或不存在,
解決:將serviceProcessInstaller1->Accout屬性,設為:LocalSystem(預設是User)。
運行: Installuitl 程式名.exe ,安裝成功。
卸載是 Installuitl /u 程式名.exe
問題:如何不使用InstallUtil 安裝 啟動 停止 卸載 Windows服務?
解決:用System.Configuration.Install.AssemblyInstaller類載入一個程式集,並運行其中的安裝程式。
[C#]
//安裝服務
public static void InstallService(string filepath, string serviceName, string[] options)
{
try
{
if (!IsServiceExisted(serviceName))
{
IDictionary mySavedState = new Hashtable();
AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
myAssemblyInstaller.UseNewContext = true;
myAssemblyInstaller.Path = filepath;
myAssemblyInstaller.CommandLine = options;
myAssemblyInstaller.Install(mySavedState);
myAssemblyInstaller.Commit(mySavedState);
myAssemblyInstaller.Dispose();
}
}
catch (Exception ex)
{
throw new Exception("Install Service Error\n" + ex.Message);
}
}
//卸載服務
public static void UnInstallService(string filepath, string serviceName, string[] options)
{
try
{
if (IsServiceExisted(serviceName))
{
AssemblyInstaller myAssemblyInstaller = new AssemblyInstaller();
myAssemblyInstaller.UseNewContext = true;
myAssemblyInstaller.Path = filepath;
myAssemblyInstaller.CommandLine = options;
myAssemblyInstaller.Uninstall(null);
myAssemblyInstaller.Dispose();
}
}
catch (Exception ex)
{
throw new Exception("UnInstall Service Error\n" + ex.Message);
}
}
//判斷服務是否存在
public static bool IsServiceExisted(string serviceName)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController s in services)
{
if (s.ServiceName == serviceName)
{
return true;
}
}
return false;
}
//啟動服務
public static void StartService(string serviceName)
{
if (IsServiceExisted(serviceName))
{
System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);
if (service.Status != System.ServiceProcess.ServiceControllerStatus.Running &&
service.Status != System.ServiceProcess.ServiceControllerStatus.StartPending)
{
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60));
}
}
}
//停止服務
public static void StopService(string serviceName)
{
if (IsServiceExisted(serviceName))
{
System.ServiceProcess.ServiceController service = new System.ServiceProcess.ServiceController(serviceName);
if (service.Status == System.ServiceProcess.ServiceControllerStatus.Running)
{
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60));
}
}
}