Jawaban:
Dalam proyek layanan lakukan hal berikut:
Sekarang Anda perlu membuat proyek pengaturan. Hal terbaik untuk dilakukan adalah menggunakan wizard pengaturan.
Klik kanan pada solusi Anda dan tambahkan proyek baru: Tambah> Proyek Baru> Setup dan Deployment Projects> Setup Wizard
Sebuah. Ini bisa sedikit berbeda untuk versi Visual Studio yang berbeda. b. Visual Studio 2010 terletak di: Instal Template> Jenis Proyek Lainnya> Pengaturan dan Penempatan> Pemasang Visual Studio
Pada langkah kedua pilih "Buat Pengaturan untuk Aplikasi Windows."
Pada langkah ke-3, pilih "Output primer dari ..."
Klik untuk Selesai.
Selanjutnya edit installer Anda untuk memastikan output yang benar disertakan.
Anda dapat mengedit nama output pemasang dengan mengklik kanan proyek Installer di solusi Anda dan pilih Properties. Ubah 'Nama file keluaran:' menjadi apa pun yang Anda inginkan. Dengan memilih proyek installer juga dan melihat jendela properti, Anda dapat mengedit Product Name
, Title
, Manufacturer
, dll ...
Selanjutnya buat installer Anda dan itu akan menghasilkan MSI dan setup.exe. Pilih mana yang ingin Anda gunakan untuk menggunakan layanan Anda.
Service name contains invalid characters, is empty, or is too long (max length = 80)
kesalahan saat menambahkan Penginstal lalu klik kanan di area abu-abu lagi, buka Properti dan pastikan bahwa nilai Nama Layanan diatur.
Saya mengikuti serangkaian langkah pertama Kelsey untuk menambahkan kelas pemasang ke proyek layanan saya, tetapi alih-alih membuat penginstal MSI atau setup.exe, saya membuat layanan pemasangan / penghapusan sendiri. Berikut sedikit kode sampel dari salah satu layanan saya yang dapat Anda gunakan sebagai titik awal.
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
dan objek Startup: (none)
. Saya harus mengubah tipe Output ke Console Application
dan mengatur objek startup saya misalnya myservice.Program
. Jika mungkin ada konsekuensi yang tidak saya sadari, mohon saran.
Nor Kelsey, atau solusi Brendan tidak berfungsi untuk saya di Visual Studio 2015 Community.
Inilah langkah-langkah singkat saya bagaimana cara membuat layanan dengan installer:
->
New->
ProjectKlik dua kali serviceInstaller1. Visual Studio menciptakan serviceInstaller1_AfterInstall
acara. Tulis kode:
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (System.ServiceProcess.ServiceController sc = new
System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
sc.Start();
}
}
Bangun solusi. Klik kanan pada proyek dan pilih 'Buka Folder di File Explorer'. Pergi ke bin \ Debug .
Buat install.bat dengan skrip di bawah ini:
:::::::::::::::::::::::::::::::::::::::::
:: 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
ke /u
)Untuk VS2017 Anda perlu menambahkan ekstensi VS "Microsoft Visual Studio 2017 Installer Projects". Ini akan memberi Anda templat proyek Visual Studio Installer tambahan. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Untuk menginstal layanan windows Anda dapat menambahkan proyek jenis setup wizard baru dan ikuti langkah-langkah dari jawaban Kelsey https://stackoverflow.com/a/9021107/1040040
Kelas InstallUtil (ServiceInstaller) dianggap sebagai anti-pola oleh komunitas Pemasang Windows. Ini rapuh, keluar dari proses, menciptakan kembali roda yang mengabaikan fakta bahwa Pemasang Windows memiliki dukungan bawaan untuk Layanan.
Proyek-proyek penyebaran Visual Studio (juga tidak begitu dihargai dan ditinggalkan dalam rilis Visual Studio berikutnya) tidak memiliki dukungan asli untuk layanan. Tetapi mereka dapat mengkonsumsi modul gabungan. Jadi saya akan melihat artikel blog ini untuk memahami cara membuat modul gabungan menggunakan Windows Installer XML yang dapat mengekspresikan layanan dan kemudian menggunakan modul gabungan itu dalam solusi VDPROJ Anda.
Augmenting InstallShield menggunakan Windows Installer XML - Layanan Windows