安装在Visual Studio中创build的Windows服务

当我在Visual Studio 2010中创build一个新的Windows服务时,我收到消息说明使用InstallUtil和net start来运行该服务。

我已经尝试了以下步骤:

  1. 创build新项目文件 – >新build – >项目 – > Windows服务
  2. 项目名称:TestService
  3. 按原样构build项目(Service1的构造函数,OnStart,OnStop)
  4. 打开命令提示符,运行“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe”TestService.exe
  5. 运行networking启动TestService

步骤4的输出

运行交易安装。

开始安装的安装阶段。

请参阅C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe程序集的日志文件内容。

该文件位于C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog。

安装程序集“C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe”。

受影响的参数是:

logtoconsole =

logfile = C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

在C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSevice \ obj \ x86 \ Debug \ TestService.exe程序集中找不到具有RunInstallerAttribute.Yes属性的公用安装程序。

安装阶段成功完成,提交阶段开始。

请参阅C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe程序集的日志文件内容。

该文件位于C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ Tes tService \ TestService \ obj \ x86 \ Debug \ TestService.InstallLog。

提交程序集'C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestS ervice \ TestService \ obj \ x86 \ Debug \ TestService.exe'。

受影响的参数是:

logtoconsole =

logfile = C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ T estService \ obj \ x86 \ Debug \ TestService.InstallLog

assemblypath = C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestServ ice \ TestService \ obj \ x86 \ Debug \ TestService.exe

在C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSevice \ obj \ x86 \ Debug \ TestService.exe程序集中找不到具有RunInstallerAttribute.Yes属性的公用安装程序。

删除InstallState文件,因为没有安装程序。

承诺阶段成功完成。

交易安装已完成。

步骤5的输出

服务名称无效。

通过键入NET HELPMSG 2185可以获得更多的帮助。

您需要在devise器中打开Service.cs文件,右键单击它并select菜单选项“添加安装程序”。

它不会立即安装,您需要先创build安装程序类。

服务安装程序的一些参考:

如何:将安装程序添加到您的服务应用程序

相当老…但这就是我所说的:

Windows服务在C#中:添加安装程序(第3部分)

通过这样做, ProjectInstaller.cs将被自动创build。 然后你可以双击这个,进入devise器,并configuration组件:

  • serviceInstaller1具有服务本身的属性: DescriptionDisplayNameServiceNameStartType是最重要的。

  • serviceProcessInstaller1有这个重要的属性: Account thas是服务将运行的帐户。

例如:

 this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem; 

看着:

在C:\ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSevice \ obj \ x86 \ Debug \ TestService.exe程序集中找不到具有RunInstallerAttribute.Yes属性的公用安装程序。

看起来你的代码中可能没有安装程序类。 这是一个inheritance自Installer的类,它将告诉installutil如何将您的可执行文件安装为服务。

Ps我有我自己的小自我安装/可debugging的Windows服务模板,您可以复制代码或使用: 可debugging,自行安装Windows服务

这是一个替代的方法来使安装程序和摆脱这个错误消息。 此外,似乎VS2015快递没有“添加安装程序”菜单项。

你只需要创build一个类,并添加下面的代码,并添加引用System.Configuration.Install.dll。

 using System.Configuration.Install; using System.ServiceProcess; using System.ComponentModel; namespace SAS { [RunInstaller(true)] public class MyProjectInstaller : Installer { private ServiceInstaller serviceInstaller1; private ServiceProcessInstaller processInstaller; public MyProjectInstaller() { // Instantiate installer for process and service. processInstaller = new ServiceProcessInstaller(); serviceInstaller1 = new ServiceInstaller(); // The service runs under the system account. processInstaller.Account = ServiceAccount.LocalSystem; // The service is started manually. serviceInstaller1.StartType = ServiceStartMode.Manual; // ServiceName must equal those on ServiceBase derived classes. serviceInstaller1.ServiceName = "SAS Service"; // Add installer to collection. Order is not important if more than one service. Installers.Add(serviceInstaller1); Installers.Add(processInstaller); } } } 

另一个可能的问题(我碰到):

确保ProjectInstaller类是public 。 说实话,我不知道我是如何做到的,但我添加了事件处理程序到ProjectInstaller.Designer.cs ,如:

this.serviceProcessInstaller1.BeforeInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_BeforeInstall);

我猜在ProjectInstaller.cs中创build处理函数的自动过程中,它改变了类的定义

public class ProjectInstaller : System.Configuration.Install.Installer

partial class ProjectInstaller : System.Configuration.Install.Installer

partial replace public关键字。 所以,为了解决它必须是

public partial class ProjectInstaller : System.Configuration.Install.Installer

我使用Visual Studio 2013社区版。

两个典型的问题:

  1. 缺lessProjectInstaller类(就像@MiguelAngelo指出的那样)
  2. 命令提示符必须“以pipe理员身份运行”

VS 2010和.NET 4.0及更高版本中的隐形更改

不能find具有RunInstallerAttribute.Yes属性的公共安装程序

在.NET中有一个别名的变化或编译器清理,可能会显示你的具体情况这个小调整。

如果您有以下代码…

 RunInstaller(true) // old alias 

您可能需要将其更新为

 RunInstallerAttribute(true) // new property spelling 

它就像在编译时或运行时在封面下发生的别名一样,你会得到这个错误行为。 以上对RunInstallerAttribute的显式更改(true)已将其固定在所有机器的所有安装场景中。

在添加项目或服务安装程序后,检查“旧”RunInstaller(true)并将其更改为新的RunInstallerAttribute(true)