Câu trả lời:
Trong dự án dịch vụ, hãy làm như sau:
Bây giờ bạn cần phải thực hiện một dự án thiết lập. Điều tốt nhất để làm là sử dụng trình hướng dẫn thiết lập.
Nhấp chuột phải vào giải pháp của bạn và thêm dự án mới: Thêm> Dự án mới> Thiết lập và triển khai dự án> Trình hướng dẫn cài đặt
a. Điều này có thể thay đổi một chút cho các phiên bản khác nhau của Visual Studio. b. Visual Studio 2010 được đặt trong: Cài đặt mẫu> Các loại dự án khác> Cài đặt và triển khai> Trình cài đặt Visual Studio
Ở bước thứ hai, chọn "Tạo thiết lập cho ứng dụng Windows."
Ở bước thứ 3, chọn "Đầu ra chính từ ..."
Nhấp qua để kết thúc.
Tiếp theo chỉnh sửa trình cài đặt của bạn để đảm bảo đầu ra chính xác được bao gồm.
Bạn có thể chỉnh sửa tên đầu ra của trình cài đặt bằng cách nhấp chuột phải vào dự án Trình cài đặt trong giải pháp của bạn và chọn Thuộc tính. Thay đổi 'Tên tệp đầu ra:' thành bất cứ điều gì bạn muốn. Bằng cách chọn dự án trình cài đặt cũng và nhìn vào cửa sổ thuộc tính, bạn có thể chỉnh sửa Product Name
, Title
, Manufacturer
, vv ...
Tiếp theo xây dựng trình cài đặt của bạn và nó sẽ tạo ra MSI và setup.exe. Chọn bất cứ điều gì bạn muốn sử dụng để triển khai dịch vụ của bạn.
Service name contains invalid characters, is empty, or is too long (max length = 80)
lỗi khi thêm Trình cài đặt thì nhấp chuột phải vào vùng màu xám một lần nữa, đi đến Thuộc tính và đảm bảo rằng giá trị Tên Dịch vụ được đặt.
Tôi làm theo các bước đầu tiên của Kelsey để thêm các lớp trình cài đặt vào dự án dịch vụ của mình, nhưng thay vì tạo trình cài đặt MSI hoặc setup.exe, tôi tự cài đặt / gỡ cài đặt dịch vụ. Đây là một chút mã mẫu từ một trong các dịch vụ của tôi mà bạn có thể sử dụng làm điểm bắt đầu.
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
và đối tượng Khởi động : (none)
. Tôi đã phải thay đổi loại đầu ra thành Console Application
và đặt đối tượng khởi động của mình, vd myservice.Program
. Nếu có thể có sự phân nhánh mà tôi không biết, xin vui lòng tư vấn.
Các giải pháp của Nor Kelsey cũng như Brendan đều không phù hợp với tôi trong Cộng đồng Visual Studio 2015.
Dưới đây là các bước ngắn gọn của tôi về cách tạo dịch vụ với trình cài đặt:
->
New->
ProjectNhấp đúp chuột vào dịch vụInstaller1. Visual Studio tạo serviceInstaller1_AfterInstall
sự kiện. Viết mã:
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
using (System.ServiceProcess.ServiceController sc = new
System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
{
sc.Start();
}
}
Xây dựng giải pháp. Nhấp chuột phải vào dự án và chọn 'Mở thư mục trong File Explorer'. Chuyển đến bin \ Gỡ lỗi .
Tạo install.bat với tập lệnh bên dưới:
:::::::::::::::::::::::::::::::::::::::::
:: 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
thành /u
)Đối với VS2017, bạn sẽ cần thêm tiện ích mở rộng VS "Microsoft Visual Studio 2017 Installer Project". Điều này sẽ cung cấp cho bạn các mẫu dự án Visual Studio Installer bổ sung. https://marketplace.visualstudio.com/items?itemName=VisualStudio ProducttTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Để cài đặt dịch vụ windows, bạn có thể thêm dự án loại trình hướng dẫn thiết lập mới và làm theo các bước từ câu trả lời của Kelsey https://stackoverflow.com/a/9021107/1040040
Các lớp InstallUtil (ServiceInstaller) được cộng đồng Windows Installer coi là một kiểu chống mẫu. Đó là một sự mong manh, không theo quy trình, phát minh lại bánh xe mà bỏ qua thực tế là Windows Installer có hỗ trợ tích hợp cho Dịch vụ.
Các dự án triển khai Visual Studio (cũng không được đánh giá cao và không dùng nữa trong phiên bản tiếp theo của Visual Studio) không có hỗ trợ riêng cho các dịch vụ. Nhưng họ có thể tiêu thụ các mô-đun hợp nhất. Vì vậy, tôi sẽ xem bài viết trên blog này để hiểu cách tạo mô-đun hợp nhất bằng Windows Installer XML có thể thể hiện dịch vụ và sau đó sử dụng mô-đun hợp nhất đó trong giải pháp VDPROJ của bạn.
Tăng cường InstallShield bằng Windows Installer XML - Windows Services