安装在 VisualStudio 中创建的 Windows 服务

当我在 VisualStudio2010中创建一个新的 Windows 服务时,我会得到一条消息,指示使用 InstallUtil 和 net start 来运行该服务。

我尝试了以下步骤:

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

步骤4的输出

运行事务处理安装。

开始安装的安装阶段。

参见日志文件的内容 C: Usermyusername DocumentsVisualStudio 2010 Projects TestService TestService obj x86 Debug TestService.exe 集会的进程。

该文件位于 C: UsermyusernameDocumentVisualStudio 2010年特斯项目 TServiceTestServiceobj x86调试 TestService.InstallLog。

安装程序集‘ C: Usermyusername 文档 VisualStudio 2010 Projects TestS service TestService obj x86 Debug TestService.exe’。

受影响的参数包括:

Logtosole =

Logfile = C: Usermyusername 文档 VisualStudio 2010项目 TestService T EstServiceobjx86调试 TestService.InstallLog

Assemblypath = C: Usermyusername 文档 VisualStudio 2010 Projects TestService ice TestService obj x86 Debug TestService.exe

没有带有 RunInstallerAttribute. Yes 属性的公共安装程序 可以在 C: Usermyusername DocumentsVisualStudio 中找到 2010项目 TestService TestSe rservice obj x86 Debug TestService.exe 集合。

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

参见日志文件的内容 C: Usermyusername DocumentsVisualStudio 2010 Projects TestService TestService obj x86 Debug TestService.exe 集会的进程。

该文件位于 C: UsermyusernameDocumentVisualStudio 2010年特斯项目 TServiceTestServiceobj x86调试 TestService.InstallLog。

提交程序集‘ C: Usermyusername 文档 VisualStudio 2010 Projects TestS service TestService obj x86 Debug TestService.exe’。

受影响的参数包括:

Logtosole =

Logfile = C: Usermyusername 文档 VisualStudio 2010项目 TestService T EstServiceobjx86调试 TestService.InstallLog

Assemblypath = C: Usermyusername 文档 VisualStudio 2010 Projects TestService ice TestService obj x86 Debug TestService.exe

没有带有 RunInstallerAttribute. Yes 属性的公共安装程序 可以在 C: Usermyusername DocumentsVisualStudio 中找到 2010项目 TestService TestSe rservice obj x86 Debug TestService.exe 集合。

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

提交阶段成功完成。

事务处理的安装已经完成。

步骤5的输出

服务名无效。

可以通过键入 NETHELPMSG2185获得更多帮助。

159068 次浏览

观察:

没有带 RunInstallerAttribute 的公共安装程序。 Yes 属性可以在 C: Users myusername Document Visual Studio 2010 Projects TestService TestSe rservice obj x86 Debug TestService.exe 程序集中找到。

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

附注: 我有自己的自我安装/可调试的 Windows 服务模板,你可以从中复制代码或使用: 可调试的自安装 Windows 服务

您需要在设计器中打开 Service.cs 文件,右键单击它并选择菜单选项“ Add Installer”。

它不会立即安装... ... 您需要首先创建安装程序类。

有关服务安装程式的参考资料:

如何: 向服务应用程序添加安装程序

很老了,但这就是我要说的:

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

通过这样做,将自动创建 ProjectInstaller.cs。然后您可以双击它,输入设计器,并配置组件:

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

  • serviceProcessInstaller1有一个重要的属性: Account,它是运行服务的帐户。

例如:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

两个典型的问题:

  1. 缺少 ProjectInstaller 类(如@MiguelAngelo 所指出的)
  2. 命令提示符必须“像 管理员一样运行”

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

确保 ProjectInstaller类是 public。老实说,我不确定我到底是如何做到的,但我向 ProjectInstaller.Designer.cs添加了事件处理程序,比如:

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

我猜在 ProjectInstaller.cs中自动创建处理程序函数的过程中,它将类定义从

public class ProjectInstaller : System.Configuration.Install.Installer

partial class ProjectInstaller : System.Configuration.Install.Installer

partial替换 public关键字

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

我使用的是 VisualStudio2013社区版。

下面是另一种安装程序并消除错误消息的方法。此外,似乎 VS2015快递没有“添加安装程序”菜单项。

您只需创建一个类并添加以下代码,然后添加引用 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);
}
}
}

VS 2010和.NET 4.0及以后的隐形变化

没有带 RunInstallerAttribute 的公共安装程序

在.NET 中有一个别名更改或编译器清理,可能会显示针对特定情况的这个小调整。

如果你有以下代码..。

RunInstaller(true)   // old alias

您可能需要将其更新为

RunInstallerAttribute(true)  // new property spelling

这就像是在编译时或运行时秘密更改了别名,您将得到这种错误行为。上面对 RunInstallerAttribute (true)的显式更改在所有计算机上的所有安装方案中都修复了它。

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

我遇到的另一个问题是: 确保您的 Installer 派生类(通常是 ProjectInstaller)位于名称空间层次结构的顶部,我试图在另一个公共类中使用一个公共类,但结果是同样的老错误:

找不到带有 RunInstallerAttribute. Yes 属性的公共安装程序