Windowsサービスがあり、情報を保存するディレクトリを作成する必要があります。ディレクトリパスは、Windowsサービスのexeファイルからの相対パスである必要があります。このexeファイルのパスを取得するにはどうすればよいですか?
ヒント:インストール済みのWindowsサービスのスタートアップパスを検索する場合は、レジストリからこちらをご覧ください。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ + ServiceName
Windowsサービスに関するキーがあります
サービスのパスを取得するには、管理オブジェクトを使用できます。参照: https://msdn.Microsoft.com/en-us/library/system.management.managementobject(v = vs.110).aspxhttp://dotnetstep.blogspot .com/2009/06/get-windowservice-executable-path-in.html
using System.Management;
string ServiceName = "YourServiceName";
using (ManagementObject wmiService = new ManagementObject("Win32_Service.Name='"+ ServiceName +"'"))
{
wmiService.Get();
string currentserviceExePath = wmiService["PathName"].ToString();
Console.WriteLine(wmiService["PathName"].ToString());
}
実行可能ファイルに関連するディレクトリを使用するため、管理者特権が必要な場合は、共通アプリケーションデータディレクトリを使用してください。
Environment.GetFolderPath(SpecialFolder.CommonApplicationData)
このように、アプリは独自のインストールディレクトリへの書き込みアクセスを必要としないため、より安全になります。
これを試して
System.Reflection.Assembly.GetEntryAssembly().Location
string exe = Process.GetCurrentProcess().MainModule.FileName;
string path = Path.GetDirectoryName(exe);
svchost.exeは、system32にあるサービスを実行する実行可能ファイルです。したがって、プロセスによって実行されているモジュールに到達する必要があります。
WindowsサービスのデフォルトのディレクトリはSystem32フォルダーです。ただし、サービスでは、OnStartで次の操作を行うことにより、現在のディレクトリをサービスのインストールで指定したディレクトリに変更できます。
// Define working directory (For a service, this is set to System)
// This will allow us to reference the app.config if it is in the same directory as the exe
Process pc = Process.GetCurrentProcess();
Directory.SetCurrentDirectory(pc.MainModule.FileName.Substring(0, pc.MainModule.FileName.LastIndexOf(@"\")));
編集:さらに簡単な方法(ただし、まだテストしていません):
System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
これは私のためにトリックをしました
Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);