「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>.NET開発]]

* 目次 [#w864c749]
#contents

*概要 [#oe28f7bc]
調査したところ、

*方法 [#i245c7f3]
**アセンブリの位置から [#w4dc830e]
 System.Reflection.Assembly. myAssembly = System.Reflection.Assembly.GetEntryAssembly();
 string path = myAssembly.Location;
>[[System.AppDomain.CurrentDomain.BaseDirectory>#k18d4cb5]]

 string path = System.Reflection.Assembly.GetExecutingAssembly().Location
が推奨方法の既定値であるもよう。

**Applicationオブジェクト [#oce14b8b]
 string path = Application.ExecutablePath;
 string path = Application.StartupPath;
*方法 [#i245c7f3]

**System [#a8394b1a]
System名前空間のライブラリを使用するのが一般的。

どれを使うべきか迷う所ですが、結果が同じなら取得に使うクラスが所属している名前空間とアセンブリが標準的なものであるかで判断したいと思います。(参照設定なしに利用できるので)
***System.AppDomain [#k18d4cb5]
アプリケーションと同じディレクトリにあるファイルを検索する場合に使用する。

 string path = System.AppDomain.CurrentDomain.BaseDirectory

・Assemblyクラスは、名前空間: System.Reflection アセンブリ: mscorlib (mscorlib.dll 内)
***System.Environment [#o8f5ed1f]
環境変数の current directoryを取得する場合に使用する。
-アプリケーションの実行中に変化する可能性のある値。
-OpenFileDialogでファイルを選択されたディレクトリに変更される可能性がある。

・Applicationクラスは、名前空間: System.Windows.Forms アセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
 string path = System.Environment.CurrentDirectory

・Environmentクラスは、名前空間: System アセンブリ: mscorlib (mscorlib.dll 内)
**System.IO [#qa818f36]
[[System.Environment>#o8f5ed1f]]と同じ、~
環境変数の current directoryを取得する場合に使用する。

・AppDomainクラスは名前空間: System アセンブリ: mscorlib (mscorlib.dll 内)
 string path = System.IO.Directory.GetCurrentDirectory();

**System.Reflection.Assembly [#w4dc830e]
***GetEntryAssembly [#p3c3a86c]
EntryAssemblyメソッドでは、EXEなどのエントリポイントとなるアセンブリを取得する。

System名前空間が最も標準的なので、EnvironmentクラスとAppDomainクラスのいずれかに決めたいと思います。どちらが良いかは判断に迷う所なので、それぞれのマニュアルを参照してアプリケーションの実行パスとしてふさわしいか判断したいと思います。
 System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetEntryAssembly();
 string path = myAssembly.Location;

Environment.GetCommandLineArgs メソッド
***GetExecutingAssembly [#xf8c47e8]
ExecutingAssemblyメソッドでは、実行中のコードを含むEXEやDLLのアセンブリを取得する。

配列の先頭の要素には、実行中のプログラムのファイル名が格納されます。ファイル名が取得できない場合、先頭の要素は String.Empty に等しくなります。残りの要素には、コマンド ラインで入力された追加のトークンが格納されます。
 string path = System.Reflection.Assembly.GetExecutingAssembly().Location

プログラム ファイル名にはパス情報を含めることができますが、必須ではありません。
**System.Windows.Forms.Application [#oce14b8b]
Windows.Forms用

引用符 (QUOTATION MARK, U+0022) 内に空白が存在しない場合、コマンド ライン引数は空白 (SPACE (U+0020) または CHARACTER TABULATION (U+0009)) で区切られます。引用符内の空白は、引用符で囲まれたテキストの一部と見なされます。区切り記号は、コマンド ライン引数には含まれません。
***ExecutablePath [#od02795a]
 string path = Application.ExecutablePath;

引用符の後に続く円記号 ("\") (REVERSE SOLIDUS (U+005C)) は、特別に解釈されます。引用符の後に 2n 個の円記号 ("\") が続く場合、コマンド ライン引数には n 個の円記号が含まれ、引用符で囲まれたテキストが開始 (前のテキストが引用符で囲まれていない場合) または終了 (前のテキストが引用符で囲まれている場合) します。引用符の後に 2n+1 個の円記号 ("\") が続く場合、コマンド ライン引数には n 個の円記号とリテラルの一重引用符が含まれます。n 個の円記号 ("\") の前に引用符がない場合、コマンド ライン引数には n 個の円記号が含まれます。
***StartupPath [#g2aaf53b]
 string path = Application.StartupPath;

コマンド ラインを単一の文字列として取得するには、CommandLine プロパティを使用します。
*参考 [#z2b1f9f0]

Windows NT 4.0, Windows 2000 プラットフォームメモ : 実行可能ファイルの名前にパスは含まれません。
-c# - Should I use AppDomain.CurrentDomain.BaseDirectory or System.Environment.CurrentDirectory? - Stack Overflow~
https://stackoverflow.com/questions/674857/should-i-use-appdomain-currentdomain-basedirectory-or-system-environment-current

Windows 98, Windows Millennium Edition プラットフォームメモ : 実行可能ファイルの名前にパスが含まれます。長いファイル名 (8.3 形式ではないファイル名) は、8.3 形式に短縮される可能性があります。
-c# - アプリケーションのフォルダパスを取得する最善の方法 - .net | CODE Q&A [日本語]~
https://code.i-harness.com/ja/q/5c2ef4

環境によってパスが含まれなかったり、短い形式のファイル名になる場合があるようです。
**.NET Tips (VB.NET,C#...) [#ma325b06]
-カレントディレクトリ(現在の作業ディレクトリ)を取得、設定する~
https://dobon.net/vb/dotnet/file/currentdirectory.html
-自分のアプリケーションの実行ファイルのパスを取得する、~
VB6のApp.Pathと同じ事を行うには?~
https://dobon.net/vb/dotnet/vb6/apppath.html

AppDomain.BaseDirectory
**tekkの日記 C#,VB.NET [#ja1ecae7]
-現在実行しているDLLのパスを取得する。(GetExecutingAssembly)~
http://d.hatena.ne.jp/tekk/20110307/1299513821
-アプリケーションの実行パスを取得する。どの方法が適切か検討してみた。~
http://d.hatena.ne.jp/tekk/20110222/1298371975

アセンブリを探すためにアセンブリ リゾルバーが使用したベース ディレクトリを取得します。
**[[Webサイトのパスを取得する方法]] [#x96b82d3]

アセンブリリゾルバーが使用するベースディレクトリは、アプリケーションの実行パスなので問題ないと思います。新しくアプリケーションドメインを作成して使用する場合は問題がありそうですが、一般的なショートカットから起動するタイプのアプリケーションでは問題にならないでしょう。

**System.AppDomain.CurrentDomain.BaseDirectory [#h519ea6c]

*参考 [#z2b1f9f0]
-アプリケーションの実行パスを取得する。どの方法が適切か検討してみた。 - tekkの日記 C#,VB.NET~
http://d.hatena.ne.jp/tekk/20110222/1298371975

----
Tags: [[:.NET開発]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS