2012-02-29 10 views
0

私はc#.Net 4.0でWindowsサービスを作成しました。デフォルトでサービス実行可能ファイルの参照ファイル

それは素晴らしいです、私はプロジェクトを構築し、実行するサービスとしてexeをインストールしました。

サービスとして動作しているときに、アプリケーションがアプリケーションの設定ファイルを参照していないことがわかりました。これはサービスexeと同じディレクトリに配置されています。

コードに完全なファイルパスを強く入力しても問題はありませんが、ユーザーが好きな場所にインストールできるため、これは理想的なソリューションではありません。

どのようにしてアプリケーションをEXEのローカルファイルに参照(検索)することができますか.Netサービスラッパーの場所を想定していません。

Googleでは何も役立たないようです。

ん作品:

var config = 
        ClassLib.XmlInterface.DeserializeConfiguration(
         "C:\\Users\\Damo\\Documents\\Visual Studio 2010\\Projects\\FileDownloadService\\FileDownloadService\\bin\\Debug\\config.xml"); 

は動作しません:(紛争がEXEにローカルき)

var config = 
        ClassLib.XmlInterface.DeserializeConfiguration(
         "config.xml"); 
+0

あなたはARGVからフルパスを得ることができます[0]? –

答えて

0

これを解決するにはいくつかの方法があります。

環境変数を作成し、そこからパスを読み取ることができます。これは、あなたがセットアップアプリケーションを持っていない場合、クルージングのようなものであり、ユーザーが設定に悩まされた場合には破損しがちです。しかし、それを正しく行うとうまくいくでしょう。

セットアップアプリケーションをお持ちの場合は、実行可能ファイルのパスをレジストリに保存し、実行時にそれを読み取ることもできます。

それとも、あなたはこのようなものを使用して、実行時に、アセンブリへのパスを取得しようとすることができます

public static string GetCoreAssemblyPathRoot() 
    { 
     const string AssemblyName = "MyAssemblyName,"; 
     var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
     var path = (from assembly in loadedAssemblies 
        where assembly.FullName.StartsWith(AssemblyName) 
        select Path.GetDirectoryName(assembly.Location)) 
        .FirstOrDefault(); 
     if (path == null) 
     { 
      return null; 
     } 
     // The last part of the path is "\bin". Remove it, and return the remainder. 
     var index = path.IndexOf("\\bin\\"); 
     return index == -1 
        ? path 
        : path.Substring(0, index); 
    } 
関連する問題