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


136

当我在Visual Studio 2010中创建新的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. 运行net start 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 \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe'。

受影响的参数是:

logtoconsole =

日志文件= 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 \ TestSe rvice \ 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 \ TestService \ TestService \ obj \ x86 \ Debug \ TestService.exe”。

受影响的参数是:

logtoconsole =

日志文件= 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 \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe程序集中找不到具有RunInstallerAttribute.Yes属性的公共安装程序。

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

提交阶段已成功完成。

事务处理安装已完成。

步骤5的输出

服务名称无效。

键入NET HELPMSG 2185,可以获得更多帮助。

Answers:


243

您需要在设计器中打开Service.cs文件,右键单击它,然后选择菜单选项“添加安装程序”。

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

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

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

很老了...但这就是我在说的:

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

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

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

  • serviceProcessInstaller1具有以下重要属性:Account将在其中运行服务的帐户。

例如:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

3
添加安装程序并将帐户设置为LocalSystem即可。谢谢!
2013年

1
我在VS2013中遇到相同的错误。我检查了您提供的链接,确认我具有ProjectInstaller,包括正确配置的组件服务[Process] Installer1。我以管理员身份运行installutil.exe。它仍然报告“找不到带有RunInstallerAttribute.Yes属性的公共安装程序”。有任何想法吗?
Barry Dysert 2014年

4
大声笑。我喜欢“相当古老”的链接指向一个名为“奥秘码”的网站。该页面越旧,名称越真实:-)
HotN16'04

什么是“设计师”?没有UI的应用程序通常不包含任何被称为设计器的内容。
Maxx

服务也有设计师,就像表格一样
Grungondola

11

看着:

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

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

附言:我在这里有自己的小块可自我安装/可调试的Windows服务模板,您可以从中复制代码或使用以下模板:可调试,可自我安装的Windows Service


当我在Visual Studio->属性->服务中右键单击TestService项目时,该页面被禁用...您是指其他位置吗?在应用程序下,程序集名称为TestService。
2011年

@John:忽略有关服务控制台的第一部分,请看从居然开始的第二部分。似乎该服务从未安装,因为找不到安装程序。
詹姆斯·迈克尔·黑尔

8

这是制作安装程序并摆脱该错误消息的另一种方法。此外,似乎VS2015 express没有“添加安装程序”菜单项。

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

同样也运行VS2015,此解决方案使我摆脱了以前收到的“没有带有RunInstallerAttribute.Yes的公共安装程序”错误消息。谢谢!
PHBeagle

6

两个典型问题:

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

4

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

确保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

public关键字替换partial。因此,为了修复它,必须

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

我使用Visual Studio 2013社区版。


我知道这是3年后的事,但这解决了我的问题。不知道为什么或何时设计师将先前的公共局部类更改为内部局部类。谢谢!
垃圾劫匪

2

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

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

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

如果您具有以下代码...

RunInstaller(true)   // old alias  

您可能需要将其更新为

RunInstallerAttribute(true)  // new property spelling

就像别名在编译时或运行时在后台进行了更改,您将获得此错误行为。对RunInstallerAttribute(true)的上述显式更改在所有计算机上的所有安装场景中均已解决。

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


据我所知,您可以省略“属性”后缀,即[RunInstaller(true)]和[RunInstallerAttribute(true)]是相同的。尝试使用其他属性,例如[DebuggerStepThrough()]和[DebuggerStepThroughAttribute()]-将它们应用于类时都可以使用。
马特

1

我遇到的另一个问题是:确保您的Installer派生类(通常是ProjectInstaller)在名称空间层次结构的顶部,我尝试在另一个公共类中使用一个公共类,但这会导致相同的旧错误:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.