WPFアプリケーションからアプリケーションのディレクトリを取得する


170

AppDomainを使用するWindowsフォームのソリューションを見つけましたが、WPF Applicationオブジェクトと同等のものは何ですか?

回答:


329

1つの方法:

System.AppDomain.CurrentDomain.BaseDirectory

それを行う別の方法は:

System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName)

ああ、ありがとう。どういうわけかAppDomainを見落としていたに違いありません。私は実際にそれを探していました...
Joey

3
@ヘレン:賛成票から判断すると、これは明らかに優れた答えです。ただし、答えはアプリディレクトリを取得する2つの方法があります。どちらも同じようにうまく機能しますか?
Christoffer Lette、2011

21
私は最初の選択肢を使います。見た目はシンプルで、メソッド呼び出しがなく、読み取り時に実際に行が何を行うかについての疑問が減ります。
フィリップ

3
私は、WCFサービス、WPFアプリケーション、およびクラスライブラリプロジェクトで最初の方法を使用しましたが、すべてうまくいきました。
アポストロフィックス2015年

1
AppDomainのは2.0で追加されましたし、常に期待通りに設定することができなかったのでNetCoreとNetStandardのために、私は、二番目のをお勧めします
cdie

28

ここに別のものがあります:

System.Reflection.Assembly.GetExecutingAssembly().Location

2
docsで述べられているように、これはシャドウコピーの後に場所を取得します。受け入れられた回答の提案がシャドウコピーの影響を受けるかどうかは、実際にはわかりません。
Christoffer Lette、2011

2
これにより、メインプログラムディレクトリではなく、呼び出していたDLLのサブディレクトリが得られました。
strattonn 2014年

7

コマンドライン引数の最初の引数を使用することもできます。

String exePath = System.Environment.GetCommandLineArgs()[0]


1
ただし、「悪意のある」アプリケーションはコマンドライン引数を変更できることに注意してください。
ダニエルローズ

@ダニエル:なぜそれ自体にそれをするのですか?または、別のアプリケーションを意味しますか?
Merlyn Morgan-Graham、

1
@Merlyn:blogs.msdn.com/b/oldnewthing/archive/2009/11/25/9928372.aspxを参照してください。引用します。これは、「プロセスのスタートアップコードに対する便利な初期化パラメータ」です。そのため、そのメモリの場所を意図的または誤って変更することができます。
ダニエルローズ

1
@ダニエル:誰ができるの?別のプロセス、または同じプロセス?足元で自分を撃つと、簡単に追跡できます。私はそれをそれほど悪ではなく、もっとばかげていると呼びます:)別のプロセスがそれを行うことができる場合、それはより興味深いです。編集:実行中のプログラムのコマンドラインの変更に関する記事には何も表示されません-起動プロセスがそれを渡すだけで(起動プロセスがコマンドラインを変更することが望ましくないことはわかりません)、クエリを実行できますWMI経由。
Merlyn Morgan-Graham

@ MerlynMorgan-Grahamは、悪意のあるアプリケーションがメモリアドレスを変更し、代わりに悪意のあるアプリケーションの別のアプリケーションを強制的に実行する可能性があります。彼らのアプリケーションがキーロガーであり、特定のアプリケーションを開いたらすぐにアクティブ化させたいので、これは悪です。そのため、コードでは、アプリケーション名をキャプチャし、バックグラウンドでキーロガーを実行してから、アプリケーションを実行します。ユーザーは無知になります。この記事ではこれについて説明していますが、その方法は説明していません。多分それはあなたが探していたものですか?
pqsk 2014年

6

私は単純string baseDir = Environment.CurrentDirectory;にその仕事をしてくれました。

幸運を

編集:

私は以前このタイプの間違いを削除しましたが、この答えのマイナス点が人々が間違った方法について知るのに役立つと思うので、私はそれを編集することを好みます。:)上記の解決策は役に立たないことを理解し、string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; 他の方法に変更しました:

1. string baseDir =   
    System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
 2. String exePath = System.Environment.GetCommandLineArgs()[0];
 3. string appBaseDir =    System.IO.Path.GetDirectoryName
    (System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);

幸運を


3
これが現在の作業ディレクトリです。それアプリケーションディレクトリと一致するかもしれませんが、それらは別々の概念です(そして最も重要なのは、たとえば、共通のファイルダイアログを開いていた場合、作業ディレクトリが変わる可能性があることです)。
ジョーイ

1
@joeyあなたは正しい。これを次のように変更しました。string appBaseDir = System.AppDomain.CurrentDomain.BaseDirectory; ありがとう。
QMaster

3
String exePath = System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
 string dir = Path.GetDirectoryName(exePath);

これを試して!


3

これを試して。忘れないでくださいusing System.Reflection

string baseDir = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

1

私はこれを試しました:

    label1.Content = Directory.GetCurrentDirectory();

ディレクトリも取得します。


これにより、現在の作業ディレクトリが取得されます。これは、プロセスディレクトリとは異なる場合があります。
Thraka

Directory.GetCurrentDirectory();を評価する必要があると思います。もっと。@Thrakaの訂正ありがとうございます。
ポール、2014

0

System.Windows.FormsからApplication.StartupPathを自由に使用することもできますが、System.Windows.Formsアセンブリへの参照を追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.