web-dev-qa-db-ja.com

.NETで実行中のexeパスを取得する最良の方法は何ですか?

C:/ dirにあるプログラムa.exeから、テキストファイルc:/dir/text.txtを開く必要があります。 a.exeの場所がわかりませんが、text.txtは常に同じパスにあります。テキストファイルにアクセスできるように、現在実行中のアセンブリの名前を内部からプログラム自体に取得する方法は?

[〜#〜] edit [〜#〜]:a.exeがWindowsサービスの場合はどうなりますか? Windowsアプリケーションではないため、アプリケーションはありません。

前もって感謝します。

64
pistacchio

私は通常、アプリケーションの.exeを含むディレクトリに次の方法でアクセスします。

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);
130
string exePath = Application.ExecutablePath;
string startupPath = Application.StartupPath;

編集-アプリケーションオブジェクトを使用しない場合:

string path = System.IO.Path.GetDirectoryName( 
      System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );

詳細はこちらをご覧ください:

http://msdn.Microsoft.com/en-us/library/aa457089.aspx

13
Winston Smith
4
Tommy Carlier

興味のあるアセンブリを取得します(たとえば、_System.Reflection.Assembly a_変数に割り当てられます):

  • System.Reflection.Assembly.GetEntryAssembly()、または
  • typeof(X).Assemblyクラスの場合Xは、興味のあるアセンブリにあります(Windowsフォームの場合、typeof(Program)を使用できます)

次に、そのAssembly aのロード元のファイルのパスを取得します。

  • System.IO.Path.GetDirectoryName(a.Location)

他の回答で説明されているように、WindowsフォームアプリケーションからのApplicationオブジェクトも可能です。

4
peSHIr

VB.NETでは、次の方法で取得できます。

Assembly.GetEntryAssembly.Location

C#の場合:

Assembly.GetEntryAssembly().Location
1
maks

nUnitでのテストでも、peSHlrの答えを使用するとうまくいきました。

var thisType = typeof(MyCustomClass);

var codeLocation = Path.GetDirectoryName(thisType.Assembly.Location);

var codeLocationPath = Path.GetDirectoryName(codeLocation);

var appConfigPath = Path.Combine(codeLocationPath, "AppConfig");
0
C0r3yh