2017-03-28 10 views
1

私はwinformアプリケーションABCを持っています。私はclickonceを使ってクライアントデバイスにこれをインストールしています。それはBaseDirectory(私のアプリケーションではAppData \ Local \ Apps \ xx \ yy \ zz \)です。 zzフォルダには、Windowsサービスからアクセスする必要があるzipフォルダがあります。私の勝利サービスからAppDataの場所を取得する方法はありますか?それも可能ですか?第三者がアプリケーションに影響を与える可能性があるので、私はそれが不可能であるという前提を持っていました。WindowsサービスからアプリケーションのBaseDirectoryを取得

+2

あなたがサービスを確認した後は、それが起動するたびに、彼のアプリケーションがレジストリにパスを記述する必要があり、それをハードコーディングしてパスにアクセスすることができますか? –

+0

@ AlexK。+ 1レジストリのアイデア。今は、回避策としてテキストファイルへのパスを書いています。私はまだアプリのデータの場所を取得する方法があるかどうかを知りたいです。 – SZT

答えて

1

のためにここにMSDNの列挙値の残りの部分を参照することができます必要がある1つでない場合には最良の選択肢は何のようだ:私が使用することをお勧めしますコメントの中で提案されているAlex Kをインストール時にレジストリに保存し、サービスで取得してください。

もう1つのオプションがMSIを使用していて、GitHubにC#ラッパーがあります。

例:

// Look for installed products containing 'Word' in their name and show their installed location 
foreach (var p in InstalledProduct.Enumerate()) 
{ 
    try 
    { 
     if (p.InstalledProductName.Contains("Word"))      
      Console.Out.WriteLine("{0} is intalled in {1}", p.GUID, p.InstallLocation);      
    } 
    catch (MSIException ex) 
    { 
     // Some products might throw an exception trying to access InstalledProductName propoerty. 
    } 
} 
+0

かなりクールです。私はそこに何が起きているのかを理解しようとしています。私のコードに私のソリューションにまったく新しいプロジェクトを導入することなく実装できるかどうかを確認することです。 – SZT

+1

私たちはプロジェクトのレジストリオプションを選ぶことにしたので、このMSIラッパーの詳細は見ていませんでした。ただし、プロジェクト内のクラスを直接インポートすることで(サブフォルダなどに入れて)、きちんと整理しておくことができます。そうしたくない場合は、別のプロジェクトをリンクする必要がありません。別のオプションは、MSIラッパーを構築し、DLLファイルをリンクすることです。 – Jurjen

+0

良いアイデアは、私はアプリケーションがクライアントデバイスでその権限を持っているかどうかわからないので、レジストリを作成することについてまだよく分かりません。しかし、それはこれまでのところ最もクリーンな解決策のようです。 – SZT

0

部分的に可能です。あなたが使用してサービスコードからクライアントシステム上APPDATAローカルディレクトリを取得することができます

var p = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 

をそれはないだろうとして、次に、あなたのアプリケーション(「XX/YY/ZZ」)に固有の部分を追加することができます環境内のどこにでも設置できます。

Path.Combine(p, "xx/yy/zz/yourfile.zip"); 

を上記の特別なフォルダはあなたがSpecialFolder Enumeration

+0

問題点私は "xx/yy/zz"ビットを知らないのですが、その場で作成されました – SZT

+0

答えはいいえ、それは不可能です。同じ正確なアルゴリズムを使用して「オンザフライ」の部分を再作成することができない限り。つまり、会社/アプリケーション/バージョンまたは再利用可能なパターンを使用している場合です。 – jogi

関連する問題