安装在Visual Studio中创build的Windows服务
当我在Visual Studio 2010中创build一个新的Windows服务时,我收到消息说明使用InstallUtil和net start来运行该服务。
我已经尝试了以下步骤:
- 创build新项目文件 – >新build – >项目 – > Windows服务
- 项目名称:TestService
- 按原样构build项目(Service1的构造函数,OnStart,OnStop)
- 打开命令提示符,运行“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ InstallUtil.exe”TestService.exe
- 运行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
具有服务本身的属性:Description
,DisplayName
,ServiceName
和StartType
是最重要的。 -
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社区版。
两个典型的问题:
- 缺lessProjectInstaller类(就像@MiguelAngelo指出的那样)
- 命令提示符必须“以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)