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

时间:2011-10-27 20:41:30

标签: c# windows service windows-services installutil

当我在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
  6. 第4步的输出

      

    运行事务安装。

         

    开始安装的安装阶段。

         

    查看日志文件的内容   C:\ Users \ myusername \ Documents \ Visual Studio   2010 \项目\ TestService的\ TestService的\ OBJ \ 86 \调试\ TestService.exe   大会的进展。

         

    该文件位于C:\ Users \ myusername \ Documents \ Visual Studio   2010 \项目\维护设备   tService \ TestService的\ OBJ \ 86 \调试\ 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 \项目\ TestService的\ t   estService \ OBJ \ 86 \调试\ TestService.InstallLog

         

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

         

    没有具有RunInstallerAttribute.Yes属性的公共安装程序   可以在C:\ Users \ myusername \ Documents \ Visual Studio中找到   2010 \ Projects \ TestService \ TestSe rvice \ _ obj \ x86 \ Debug \ TestService.exe   组装

         

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

         

    查看日志文件的内容   C:\ Users \ myusername \ Documents \ Visual Studio   2010 \项目\ TestService的\ TestService的\ OBJ \ 86 \调试\ TestService.exe   大会的进展。

         

    该文件位于C:\ Users \ myusername \ Documents \ Visual Studio   2010 \项目\维护设备   tService \ TestService的\ OBJ \ 86 \调试\ 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 \项目\ TestService的\ t   estService \ OBJ \ 86 \调试\ TestService.InstallLog

         

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

         

    没有具有RunInstallerAttribute.Yes属性的公共安装程序   可以在C:\ Users \ myusername \ Documents \ Visual Studio中找到   2010 \ Projects \ TestService \ TestSe rvice \ _ obj \ x86 \ Debug \ TestService.exe   组装

         

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

         

    提交阶段已成功完成。

         

    已完成交易安装。

    第5步的输出

    服务名称无效。

    输入NET HELPMSG 2185即可获得更多帮助。

7 个答案:

答案 0 :(得分:226)

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

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

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

How to: Add Installers to Your Service Application

很老......但这就是我所说的:

Windows Services in C#: Adding the Installer (part 3)

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

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

  • serviceProcessInstaller1具有以下重要属性:Account,即服务运行的帐户。

例如:

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;

答案 1 :(得分:11)

看着:

  

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

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

P.S。我在这里有自己的小型自安装/可调试Windows服务模板,您可以从中复制代码或使用:Debuggable, Self-Installing Windows Service

答案 2 :(得分:8)

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

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

答案 3 :(得分:4)

两个典型问题:

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

答案 4 :(得分:3)

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

确保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社区版。

答案 5 :(得分:1)

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

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

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

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

RunInstaller(true)   // old alias  

您可能需要将其更新为

RunInstallerAttribute(true)  // new property spelling

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

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

答案 6 :(得分:1)

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

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