Visual Studio를 사용하여 만든 Windows 서비스 용 설치 관리자를 만들려면 어떻게합니까?
답변
서비스 프로젝트에서 다음을 수행하십시오.
- 솔루션 탐색기에서 services .cs 파일을 두 번 클릭하십시오. 모두 회색 인 화면이 나타나고 도구 상자에서 항목을 드래그하는 것에 대해 이야기합니다.
- 그런 다음 회색 영역을 마우스 오른쪽 버튼으로 클릭하고 설치 프로그램 추가를 선택하십시오. 설치 프로그램 프로젝트 파일이 프로젝트에 추가됩니다.
- 그런 다음 ProjectInstaller.cs (serviceProcessInstaller1 및 serviceInstaller1)의 디자인보기에 2 개의 구성 요소가 있습니다. 그런 다음 필요한 서비스 이름 및 사용자와 같은 속성을 설정해야합니다.
이제 설정 프로젝트를 만들어야합니다. 가장 좋은 방법은 설정 마법사를 사용하는 것입니다.
-
솔루션을 마우스 오른쪽 단추로 클릭하고 새 프로젝트를 추가하십시오 : 추가> 새 프로젝트> 설정 및 배치 프로젝트> 설정 마법사
ㅏ. Visual Studio 버전마다 약간 다를 수 있습니다. 비. Visual Studio 2010의 위치 : 템플릿 설치> 기타 프로젝트 유형> 설치 및 배포> Visual Studio Installer
-
두 번째 단계에서 “Windows 응용 프로그램 용 설치 프로그램 만들기”를 선택하십시오.
-
세 번째 단계에서 “Primary output from …”을 선택하십시오.
-
클릭하여 완료합니다.
다음으로 올바른 출력이 포함되도록 설치 프로그램을 편집하십시오.
- 솔루션 탐색기에서 설정 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
- 보기> 사용자 정의 조치를 선택하십시오. (VS2008에서는보기> 편집기> 사용자 지정 작업 일 수 있음)
- 사용자 정의 조치 트리에서 설치 조치를 마우스 오른쪽 단추로 클릭하고 ‘사용자 정의 조치 추가 …’를 선택하십시오.
- “프로젝트에서 항목 선택”대화 상자에서 응용 프로그램 폴더를 선택하고 확인을 클릭하십시오.
- “1 차 출력 …”옵션을 선택하려면 확인을 클릭하십시오. 새로운 노드가 생성되어야합니다.
- 커밋, 롤백 및 제거 작업에 대해 4-5 단계를 반복하십시오.
솔루션에서 설치 프로그램 프로젝트를 마우스 오른쪽 단추로 클릭하고 등록 정보를 선택하여 설치 프로그램 출력 이름을 편집 할 수 있습니다. ‘출력 파일 이름 :’을 원하는 것으로 변경하십시오. 뿐만 아니라 설치 프로젝트를 선택하고 속성 창에서 찾고, 당신은을 편집 할 수 있습니다 Product Name
, Title
, Manufacturer
, 등 …
다음으로 설치 프로그램을 빌드하면 MSI와 setup.exe가 생성됩니다. 서비스 배포에 사용할 것을 선택하십시오.
답변
Kelsey의 첫 번째 단계에 따라 설치 프로그램 클래스를 서비스 프로젝트에 추가하지만 MSI 또는 setup.exe 설치 프로그램을 만드는 대신 서비스를 자동 설치 / 제거합니다. 내 서비스 중 하나에서 시작점으로 사용할 수있는 약간의 샘플 코드가 있습니다.
public static int Main(string[] args)
{
if (System.Environment.UserInteractive)
{
// we only care about the first two characters
string arg = args[0].ToLowerInvariant().Substring(0, 2);
switch (arg)
{
case "/i": // install
return InstallService();
case "/u": // uninstall
return UninstallService();
default: // unknown option
Console.WriteLine("Argument not recognized: {0}", args[0]);
Console.WriteLine(string.Empty);
DisplayUsage();
return 1;
}
}
else
{
// run as a standard service as we weren't started by a user
ServiceBase.Run(new CSMessageQueueService());
}
return 0;
}
private static int InstallService()
{
var service = new MyService();
try
{
// perform specific install steps for our queue service.
service.InstallService();
// install the service with the Windows Service Control Manager (SCM)
ManagedInstallerClass.InstallHelper(new string[] { Assembly.GetExecutingAssembly().Location });
}
catch (Exception ex)
{
if (ex.InnerException != null && ex.InnerException.GetType() == typeof(Win32Exception))
{
Win32Exception wex = (Win32Exception)ex.InnerException;
Console.WriteLine("Error(0x{0:X}): Service already installed!", wex.ErrorCode);
return wex.ErrorCode;
}
else
{
Console.WriteLine(ex.ToString());
return -1;
}
}
return 0;
}
private static int UninstallService()
{
var service = new MyQueueService();
try
{
// perform specific uninstall steps for our queue service
service.UninstallService();
// uninstall the service from the Windows Service Control Manager (SCM)
ManagedInstallerClass.InstallHelper(new string[] { "/u", Assembly.GetExecutingAssembly().Location });
}
catch (Exception ex)
{
if (ex.InnerException.GetType() == typeof(Win32Exception))
{
Win32Exception wex = (Win32Exception)ex.InnerException;
Console.WriteLine("Error(0x{0:X}): Service not installed!", wex.ErrorCode);
return wex.ErrorCode;
}
else
{
Console.WriteLine(ex.ToString());
return -1;
}
}
return 0;
}
답변
Kelsey와 Brendan 솔루션도 Visual Studio 2015 Community에서 작동하지 않습니다.
설치 프로그램으로 서비스를 작성하는 방법에 대한 간단한 단계는 다음과 같습니다.
- Visual Studio를 실행하고 File
->
New->
Project - ‘설치된 템플릿 검색 ‘에서 ‘서비스’를 입력하고 .NET Framework 4를 선택하십시오.
- ‘Windows 서비스’를 선택하십시오. 이름과 위치를 입력하십시오. 를 누릅니다 OK.
- Service1.cs를 두 번 클릭하고 디자이너를 마우스 오른쪽 단추로 클릭 한 다음 ‘Add Installer’를 선택하십시오.
- ProjectInstaller.cs를 두 번 클릭하십시오. serviceProcessInstaller1의 경우 특성 탭을 열고 ‘계정’특성 값을 ‘LocalService’로 변경하십시오. serviceInstaller1의 경우 ‘ServiceName’을 변경하고 ‘StartType’을 ‘Automatic’으로 설정하십시오.
-
serviceInstaller1을 두 번 클릭하십시오. Visual Studio가
serviceInstaller1_AfterInstall
이벤트를 만듭니다 . 코드 작성 :private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e) { using (System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName)) { sc.Start(); } }
-
솔루션을 구축하십시오. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 ‘파일 탐색기에서 폴더 열기’를 선택하십시오. bin \ Debug로 이동하십시오 .
-
아래 스크립트를 사용하여 install.bat를 작성하십시오.
::::::::::::::::::::::::::::::::::::::::: :: Automatically check & get admin rights ::::::::::::::::::::::::::::::::::::::::: @echo off CLS ECHO. ECHO ============================= ECHO Running Admin shell ECHO ============================= :checkPrivileges NET FILE 1>NUL 2>NUL if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges ) :getPrivileges if '%1'=='ELEV' (shift & goto gotPrivileges) ECHO. ECHO ************************************** ECHO Invoking UAC for Privilege Escalation ECHO ************************************** setlocal DisableDelayedExpansion set "batchPath=%~0" setlocal EnableDelayedExpansion ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs" ECHO UAC.ShellExecute "!batchPath!", "ELEV", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs" "%temp%\OEgetPrivileges.vbs" exit /B :gotPrivileges :::::::::::::::::::::::::::: :START :::::::::::::::::::::::::::: setlocal & pushd . cd /d %~dp0 %windir%\Microsoft.NET\Framework\v4.0.30319\InstallUtil /i "WindowsService1.exe" pause
- 파일 uninstall.bat 만들기 (펜 ULT 라인의 변화
/i
에/u
) - 서비스를 설치하고 시작하려면 install.bat를 실행하고, uninstall.bat를 중지하고 설치 제거하십시오.
답변
VS2017의 경우 “Microsoft Visual Studio 2017 설치 관리자 프로젝트”VS 확장을 추가해야합니다. 추가 Visual Studio Installer 프로젝트 템플릿이 제공됩니다. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Windows 서비스를 설치하려면 새 설치 마법사 유형 프로젝트를 추가하고 Kelsey의 답변 https://stackoverflow.com/a/9021107/1040040 의 단계를 수행 하십시오.
답변
InstallUtil 클래스 (ServiceInstaller)는 Windows Installer 커뮤니티에서 안티 패턴으로 간주됩니다. Windows Installer가 기본적으로 서비스 지원을 제공한다는 사실을 무시하고 깨지기 쉬운 프로세스로 인해 바퀴를 다시 발명했습니다.
Visual Studio 배포 프로젝트 (다음 Visual Studio 릴리스에서 높이 평가되지 않거나 더 이상 사용되지 않음)는 서비스를 기본적으로 지원하지 않습니다. 그러나 그들은 병합 모듈을 소비 할 수 있습니다. 따라서이 블로그 기사를보고 서비스를 표현할 수있는 Windows Installer XML을 사용하여 병합 모듈을 생성 한 다음 VDPROJ 솔루션에서 해당 병합 모듈을 사용하는 방법을 이해합니다.
Windows Installer XML을 사용하여 InstallShield 기능 보강-Windows 서비스