[C#] Visual Studio에서 만든 Windows 서비스 설치

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 \ TestS ervice \ 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 \ TestS ervice \ 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를 입력하면 추가 도움말을 볼 수 있습니다.



답변

디자이너에서 Service.cs 파일을 열고 마우스 오른쪽 단추로 클릭 한 다음 메뉴 옵션 “Add Installer”를 선택하십시오.

즉시 설치되지는 않습니다 … 먼저 설치 관리자 클래스를 만들어야합니다.

서비스 설치 프로그램에 대한 일부 참조 :

방법 : 서비스 응용 프로그램에 설치 관리자 추가

아주 오래된 …하지만 이것이 내가 말하는 것입니다 :

C #의 Windows 서비스 : 설치 관리자 추가 (3 부)

이렇게하면 a ProjectInstaller.cs가 자동으로 생성됩니다. 그런 다음이를 두 번 클릭하고 디자이너를 입력 한 후 구성 요소를 구성하십시오.

  • serviceInstaller1서비스 자체의 속성이 있습니다 Description, DisplayName, ServiceName그리고 StartType가장 중요하다.

  • serviceProcessInstaller1이 중요한 속성이 있습니다. Account즉, 서비스가 실행될 계정입니다.

예를 들면 다음과 같습니다.

this.serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;


답변

보고 :

C : \ Users \ myusername \ Documents \ Visual Studio 2010 \ Projects \ TestService \ TestSe rvice \ obj \ x86 \ Debug \ TestService.exe 어셈블리에서 RunInstallerAttribute.Yes 특성이있는 공용 설치 관리자를 찾을 수 없습니다.

코드에 설치 관리자 클래스가없는 것 같습니다. 이것은 클래스를 상속받은 클래스로 실행 파일을 서비스로 설치하는 방법을 Installer알려 installutil줍니다.

추신 : 나는 당신이 여기에서 코드를 복사하거나 사용할 수있는 작은 자체 설치 / 디버깅 가능한 Windows 서비스 템플릿을 가지고 있습니다 : Debuggable, Self-Installing Windows Service


답변

다음은 설치 관리자를 만들고 해당 오류 메시지를 제거하는 다른 방법입니다. 또한 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);
        }
    }
}


답변

두 가지 일반적인 문제 :

  1. @MiguelAngelo가 지적했듯이 ProjectInstaller 클래스가 누락되었습니다.
  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

public키워드를로 교체 하십시오 partial. 따라서 문제를 해결하려면

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

Visual Studio 2013 Community Edition을 사용합니다.


답변

VS 2010 및 .NET 4.0 이상에서의 스텔스 변경

RunInstallerAttribute.Yes 속성이있는 공용 설치 프로그램을 찾을 수 없습니다.

.NET에는 별명 변경이나 컴파일러 정리가있어 특정 경우에 약간의 조정이있을 수 있습니다.

다음 코드가 있다면…

RunInstaller(true)   // old alias  

업데이트해야 할 수도 있습니다.

RunInstallerAttribute(true)  // new property spelling

컴파일 타임이나 런타임에 커버에서 변경된 별칭과 같 으며이 오류 동작이 발생합니다. RunInstallerAttribute (true)에 대한 위의 명시적인 변경은 모든 컴퓨터의 모든 설치 시나리오에서 수정되었습니다.

프로젝트 또는 서비스 설치 프로그램을 추가 한 후 “이전”RunInstaller (true)를 확인하고 새 RunInstallerAttribute (true)로 변경하십시오.


답변

또 다른 문제는 설치 프로그램 파생 클래스 (일반적으로 ProjectInstaller)가 네임 스페이스 계층 구조의 최상위에 있는지 확인 하고 다른 공개 클래스 내에서 공개 클래스를 사용하려고 시도했지만 이전과 동일한 오류가 발생한다는 것입니다.

RunInstallerAttribute.Yes 속성이있는 공용 설치 프로그램을 찾을 수 없습니다.