web-dev-qa-db-ja.com

C#を使用してWindowsサービスのインストールディレクトリを見つけるにはどうすればよいですか?

InstallUtil.exeを使用してインストールすると、Windowsサービスの作業ディレクトリとしてC:\ winnt(または同様のもの)が取得されると確信しています。サービスが最初にインストールされたディレクトリにアクセスする、または(インストール時に)キャプチャする方法はありますか?現時点では、それをapp.exe.configファイルに手動で入力していますが、それはひどく手動であり、ハックのように感じます。

実行時またはインストール時に、サービスがどこからインストールされたかを判別するためのプログラム的な方法はありますか?

19
endian

リフレクションを使用して、実行中のアセンブリの場所を取得できます。リフレクションを使用して、作業ディレクトリを実行中のアセンブリの場所に設定する簡単なルーチンを次に示します。

String path = System.Reflection.Assembly.GetExecutingAssembly().Location;
path = System.IO.Path.GetDirectoryName(path);
Directory.SetCurrentDirectory(path);
34
Steve Wranovsky

アセンブリを含むディレクトリが必要ですか?もしそうなら、それは簡単です:使用 Assembly.Location

私はプロセスの作業ディレクトリを変更しようとはしませんが-それが厄介な副作用を持っていても驚かないでしょう、本当にあなたが再それを行うことを許可されました。

7
Jon Skeet

Directory.SetCurrentDirectoryメソッドを知りませんでした。通常私はします:

Environment.CurrentDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
5
Ramon Smits

非常に遅いですが、それは誰かを助けるかもしれません。 AppDomain.CurrentDomain.BaseDirectoryを使用してこの問題を解決しました

string someFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Resources\SomeResource.xml";

AppDomain.CurrentDomain.BaseDirectoryは、C:\ Windows\system32 \パスではなく、Windowsサービスが実際にインストールされたディレクトリを提供しました。

@Ramonがすでに同じ解決策を投稿しているのを後で見ました。

3
DiligentKarma

_InstallUtil.exe_は、インストール時にアプリケーションのServiceInstaller.Install()を呼び出します。

それを上書きし、プロジェクトのInstallersのリストに追加して、必要な情報を取得します。

2
Quassnoi