「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
System.Reflection.Assembly. myAssembly = System.Reflection.Assembly.GetEntryAssembly(); string path = myAssembly.Location;
string path = System.Reflection.Assembly.GetExecutingAssembly().Location
string path = Application.ExecutablePath; string path = Application.StartupPath;
どれを使うべきか迷う所ですが、結果が同じなら取得に使うクラスが所属している名前空間とアセンブリが標準的なものであるかで判断したいと思います。(参照設定なしに利用できるので)
・Assemblyクラスは、名前空間: System.Reflection アセンブリ: mscorlib (mscorlib.dll 内)
・Applicationクラスは、名前空間: System.Windows.Forms アセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
・Environmentクラスは、名前空間: System アセンブリ: mscorlib (mscorlib.dll 内)
・AppDomain?クラスは名前空間: System アセンブリ: mscorlib (mscorlib.dll 内)
System名前空間が最も標準的なので、EnvironmentクラスとAppDomain?クラスのいずれかに決めたいと思います。どちらが良いかは判断に迷う所なので、それぞれのマニュアルを参照してアプリケーションの実行パスとしてふさわしいか判断したいと思います。
Environment.GetCommandLineArgs? メソッド
配列の先頭の要素には、実行中のプログラムのファイル名が格納されます。ファイル名が取得できない場合、先頭の要素は String.Empty に等しくなります。残りの要素には、コマンド ラインで入力された追加のトークンが格納されます。
プログラム ファイル名にはパス情報を含めることができますが、必須ではありません。
引用符 (QUOTATION MARK, U+0022) 内に空白が存在しない場合、コマンド ライン引数は空白 (SPACE (U+0020) または CHARACTER TABULATION (U+0009)) で区切られます。引用符内の空白は、引用符で囲まれたテキストの一部と見なされます。区切り記号は、コマンド ライン引数には含まれません。
引用符の後に続く円記号 ("\") (REVERSE SOLIDUS (U+005C)) は、特別に解釈されます。引用符の後に 2n 個の円記号 ("\") が続く場合、コマンド ライン引数には n 個の円記号が含まれ、引用符で囲まれたテキストが開始 (前のテキストが引用符で囲まれていない場合) または終了 (前のテキストが引用符で囲まれている場合) します。引用符の後に 2n+1 個の円記号 ("\") が続く場合、コマンド ライン引数には n 個の円記号とリテラルの一重引用符が含まれます。n 個の円記号 ("\") の前に引用符がない場合、コマンド ライン引数には n 個の円記号が含まれます。
コマンド ラインを単一の文字列として取得するには、CommandLine? プロパティを使用します。
Windows NT 4.0, Windows 2000 プラットフォームメモ : 実行可能ファイルの名前にパスは含まれません。
Windows 98, Windows Millennium Edition プラットフォームメモ : 実行可能ファイルの名前にパスが含まれます。長いファイル名 (8.3 形式ではないファイル名) は、8.3 形式に短縮される可能性があります。
環境によってパスが含まれなかったり、短い形式のファイル名になる場合があるようです。
アセンブリを探すためにアセンブリ リゾルバーが使用したベース ディレクトリを取得します。
アセンブリリゾルバーが使用するベースディレクトリは、アプリケーションの実行パスなので問題ないと思います。新しくアプリケーションドメインを作成して使用する場合は問題がありそうですが、一般的なショートカットから起動するタイプのアプリケーションでは問題にならないでしょう。
Tags: :.NET開発