ฉันจะสร้างตัวติดตั้งสำหรับบริการ Windows ที่ฉันสร้างขึ้นโดยใช้ Visual Studio ได้อย่างไร
ฉันจะสร้างตัวติดตั้งสำหรับบริการ Windows ที่ฉันสร้างขึ้นโดยใช้ Visual Studio ได้อย่างไร
คำตอบ:
ในโครงการบริการให้ทำดังต่อไปนี้:
ตอนนี้คุณต้องสร้างโครงการติดตั้ง สิ่งที่ดีที่สุดที่ต้องทำคือใช้ตัวช่วยการตั้งค่า
คลิกขวาที่โซลูชันของคุณและเพิ่มโครงการใหม่: เพิ่ม> โครงการใหม่> โครงการติดตั้งและปรับใช้> ตัวช่วยสร้างการติดตั้ง
สิ่งนี้อาจแตกต่างกันเล็กน้อยสำหรับ Visual Studio รุ่นต่างๆ ข Visual Studio 2010 ตั้งอยู่ใน: ติดตั้งแม่แบบ> ประเภทโครงการอื่น ๆ > การติดตั้งและการปรับใช้> ตัวติดตั้ง Studio Visual
ในขั้นตอนที่สองเลือก "สร้างการตั้งค่าสำหรับแอปพลิเคชัน Windows"
ในขั้นตอนที่ 3 เลือก "เอาต์พุตหลักจาก ... "
คลิกผ่านเพื่อเสร็จสิ้น
แก้ไขตัวติดตั้งของคุณต่อไปเพื่อให้แน่ใจว่ามีการรวมเอาท์พุทที่ถูกต้อง
คุณสามารถแก้ไขชื่อเอาต์พุตของตัวติดตั้งได้โดยคลิกขวาที่โครงการตัวติดตั้งในโซลูชันของคุณและเลือกคุณสมบัติ เปลี่ยน 'ชื่อไฟล์เอาต์พุต:' เป็นสิ่งที่คุณต้องการ โดยการเลือกโครงการติดตั้งเป็นอย่างดีและมองไปที่หน้าต่างคุณสมบัติคุณสามารถแก้ไขProduct Name
, Title
, Manufacturer
ฯลฯ ...
ถัดไปสร้างตัวติดตั้งของคุณและมันจะสร้าง MSI และ setup.exe เลือกสิ่งที่คุณต้องการใช้เพื่อปรับใช้บริการของคุณ
Service name contains invalid characters, is empty, or is too long (max length = 80)
ข้อผิดพลาดเมื่อเพิ่มตัวติดตั้งให้คลิกขวาในพื้นที่สีเทาอีกครั้งไปที่คุณสมบัติและตรวจสอบให้แน่ใจว่าได้ตั้งค่าชื่อบริการแล้ว
ฉันทำตามขั้นตอนชุดแรกของ 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;
}
Windows Application
(none)
ผมมีการเปลี่ยนแปลงประเภทเอาท์พุทและการตั้งค่าของฉันเช่นวัตถุเริ่มต้นConsole Application
myservice.Program
หากอาจมีการแตกหักซึ่งฉันไม่ทราบโปรดแจ้ง
Nor Kelsey และโซลูชันของ Brendan ไม่ได้ผลสำหรับฉันในชุมชน Visual Studio 2015
นี่คือขั้นตอนสั้น ๆ ของฉันวิธีการสร้างบริการด้วยตัวติดตั้ง:
->
New->
Projectดับเบิลคลิก 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();
}
}
สร้างโซลูชัน คลิกขวาที่โครงการและเลือก 'เปิดโฟลเดอร์ใน File Explorer' ไปที่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
/i
เป็น/u
)สำหรับ VS2017 คุณจะต้องเพิ่มส่วนขยาย VS "Microsoft Visual Studio 2017 โครงการ" สิ่งนี้จะให้แม่แบบโครงการ 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 ของคุณ
การขยาย InstallShield โดยใช้ Windows Installer XML - บริการ Windows