回答:
サービスプロジェクトで、次の操作を行います。
次に、セットアッププロジェクトを作成する必要があります。最善の方法は、セットアップウィザードを使用することです。
ソリューションを右クリックして、新しいプロジェクトを追加します。追加>新規プロジェクト>セットアップおよびデプロイメントプロジェクト>セットアップウィザード
a。これは、Visual Studioのバージョンによって若干異なる場合があります。b。Visual Studio 2010は次の場所にあります:テンプレートのインストール>その他のプロジェクトタイプ>セットアップと展開> Visual Studioインストーラ
2番目のステップで、「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インストーラーを作成する代わりに、サービスを自己インストール/アンインストールします。以下は、開始点として使用できる私のサービスの1つからのサンプルコードです。
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
。気付かない影響があるかもしれない場合は、お知らせください。
KelseyもBrendanソリューションも、Visual Studio 2015 Communityでは機能しません。
インストーラーでサービスを作成するための簡単な手順は次のとおりです。
->
New->
ProjectserviceInstaller1をダブルクリックします。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
/i
を/u
)VS2017の場合、 "Microsoft Visual Studio 2017 Installer Projects" VS拡張機能を追加する必要があります。これにより、追加のVisual Studio Installerプロジェクトテンプレートが提供されます。https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects#overview
Windowsサービスをインストールするには、新しいセットアップウィザードタイプのプロジェクトを追加し、Kelseyの回答https://stackoverflow.com/a/9021107/1040040の手順に従ってください。
InstallUtilクラス(ServiceInstaller)は、Windowsインストーラーコミュニティによってアンチパターンと見なされています。Windowsインストーラーがサービスの組み込みサポートを備えているという事実を無視するのは、壊れやすく、プロセスから外れた、ホイールの再発明です。
Visual Studioデプロイメントプロジェクト(Visual Studioの次のリリースでも同様に高く評価され、非推奨になっていません)は、サービスをネイティブでサポートしていません。しかし、それらはマージモジュールを消費する可能性があります。そこで、このブログ記事を見て、サービスを表現できるWindowsインストーラーXMLを使用してマージモジュールを作成し、VDPROJソリューションでそのマージモジュールを使用する方法を理解します。