Yanıtlar:
Hizmet projesinde aşağıdakileri yapın:
Şimdi bir kurulum projesi yapmanız gerekiyor. Yapılacak en iyi şey kurulum sihirbazını kullanmaktır.
Çözümünüzü sağ tıklayın ve yeni bir proje ekleyin: Ekle> Yeni Proje> Kurulum ve Dağıtım Projeleri> Kurulum Sihirbazı
a. Bu, Visual Studio'nun farklı sürümleri için biraz farklılık gösterebilir. b. Bulunduğu Visual Studio 2010: Şablonları Yükle> Diğer Proje Türleri> Kurulum ve Dağıtım> Visual Studio Yükleyici
İkinci adımda "Windows Uygulaması için Kurulum Oluştur" u seçin.
3. adımda "Birincil çıktı ..." seçeneğini belirleyin.
Bitirmek için tıklayın.
Ardından, doğru çıkışın eklendiğinden emin olmak için yükleyicinizi düzenleyin.
Çözümleyicinizin çıktı adını, çözümünüzdeki Installer projesine sağ tıklayıp Özellikler'i seçerek düzenleyebilirsiniz. 'Çıktı dosyası adı:' seçeneğini istediğiniz şekilde değiştirin. Hem yükleyici projesini seçerek ve özellikleri pencere bakarak, düzenleyebilir Product Name
, Title
, Manufacturer
, vb ...
Sonra yükleyicinizi oluşturun ve bir MSI ve setup.exe üretecektir. Hizmetinizi dağıtmak için hangisini kullanmak istediğinizi seçin.
Service name contains invalid characters, is empty, or is too long (max length = 80)
Yükleyiciyi eklerken bir hata alırsanız , gri alana tekrar sağ tıklayın, Özellikler'e gidin ve Hizmet Adı değerinin ayarlandığından emin olun.
Kelsey'in kurulum sınıflarını servis projeme eklemek için ilk adımlarını takip ediyorum, ancak MSI veya setup.exe yükleyicisi oluşturmak yerine hizmeti kendiliğinden yükleme / kaldırma yapıyorum. İşte bir başlangıç noktası olarak kullanabileceğiniz servislerimden bir örnek kod.
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
ve Başlangıç nesnesi: olarak ayarlandı (none)
. Çıktı türünü değiştirmek Console Application
ve başlangıç nesnesimi ayarlamak zorunda kaldım myservice.Program
. Farkında olmadığım sonuçlar varsa, lütfen tavsiye edin.
Ne Kelsey, ne de Brendan çözümleri Visual Studio 2015 Topluluğu'nda benim için çalışmıyor.
Yükleyiciyle nasıl hizmet oluşturabileceğime ilişkin kısa adımlarım:
->
New->
ProjectServiceInstaller1 öğesine çift tıklayın. Visual Studio serviceInstaller1_AfterInstall
olay oluşturur . Kod yaz:
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (System.ServiceProcess.ServiceController sc = new
System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
sc.Start();
}
}
Çözüm oluşturun. Projeye sağ tıklayın ve 'Klasörü Dosya Gezgini'nde Aç'ı seçin. Git bin \ Debug .
Aşağıdaki komut dosyası ile install.bat oluşturun:
:::::::::::::::::::::::::::::::::::::::::
:: 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
için /u
)VS2017 için "Microsoft Visual Studio 2017 Installer Projects" VS uzantısını eklemeniz gerekir. Bu size ek Visual Studio Installer proje şablonları verecektir. https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Windows hizmetini yüklemek için yeni bir kurulum sihirbazı türü proje ekleyebilir ve Kelsey'in cevabındaki adımları takip edebilirsiniz https://stackoverflow.com/a/9021107/1040040
InstallUtil sınıfları (ServiceInstaller), Windows Installer topluluğu tarafından bir anti-desen olarak kabul edilir. Windows Installer'ın Hizmetler için yerleşik desteğe sahip olduğunu görmezden gelen, tekerleği yeniden işleyen kırılgan bir süreç.
Visual Studio dağıtım projelerinin (ayrıca Visual Studio'nun bir sonraki sürümünde dikkate alınmayan ve kullanımdan kaldırılmayan) hizmetler için yerel destek yoktur. Ancak birleştirme modüllerini tüketebilirler. Bu yüzden, hizmeti yükleyebilen ve daha sonra VDPROJ çözümünüzdeki birleştirme modülünü tüketen birleştirme modülü oluşturma işlemini anlamak için bu blog makalesine bir göz atacağım.
Windows Installer XML Kullanarak InstallShield'ı Artırmak - Windows Services