web-dev-qa-db-ja.com

アプリケーションのルートディレクトリを決定する最良の方法は何ですか?

アプリケーションのルートディレクトリにあるすべてのdllを取得する必要があります。それを行う最良の方法は何ですか?

string root = Application.StartupPath;

または、

string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName;

それとその後、

Directory.GetFiles(root, "*.dll");

どちらの方法が良いですか?より良い方法はありますか?

49
abatishchev

AppDomain.CurrentDomain.BaseDirectoryはそうするための私のやり方です。

しかしながら:

Application.StartupPathは、実行可能ファイルのディレクトリを取得します

AppDomain.BaseDirectoryは、アセンブリの解決に使用されるディレクトリを取得します

これらは異なる可能性があるため、アセンブリの解決を気にしない限り、おそらくApplication.StartupPathを使用したいでしょう。

69
Greg Dean

場合によります。アプリケーションを起動したEXEのディレクトリが必要な場合は、2つの例のいずれかが機能します。 。

それはあまり頻繁に起こることではなく、もしそうなら書かれていただろうが、可能性はある。そのため、興味のあるアセンブリを指定し、そこからディレクトリを取得することを好みます。その後、その特定のアセンブリと同じディレクトリにすべてのDLLを取得していることを知っています。たとえば、クラスがMyApp.MyClassであるアプリケーションMyApp.exeがある場合、これを実行します。

string root = string.Empty;
Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) );
if ( ass != null )
{
   root = ass.Location;
}
20
Rob Prouse

これは古い質問ですが、私はいつも使用していました:

Environment.CurrentDirectory = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);

ただし、ここのソリューションを見ると、いくつかの簡単なテストを実行する必要があると思います。

var r = new List<long>();
var s = Stopwatch.StartNew();

s.Restart();
string root1 = Application.StartupPath;
r.Add(s.ElapsedTicks);

s.Restart();
string root2 = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
r.Add(s.ElapsedTicks);

s.Restart();
string root3 = Path.GetDirectoryName(new FileInfo(Assembly.GetExecutingAssembly().Location).FullName);
r.Add(s.ElapsedTicks);

s.Restart();
string root4 = AppDomain.CurrentDomain.BaseDirectory;
r.Add(s.ElapsedTicks);

s.Restart();
string root5 = Path.GetDirectoryName(Assembly.GetAssembly( typeof( Form1 ) ).Location);
r.Add(s.ElapsedTicks);

ティックの結果:

  • 49
  • 306
  • 166
  • 26
  • 201

そうらしい、それっぽい AppDomain.CurrentDomain.BaseDirectoryは進むべき道です。

8
eried

アプリケーションのルートフォルダパスを取得する場合は、以下のコードサンプルを使用します。

string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName
2
Telan Niranga

私が使う

Path.GetDirectoryName(new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath)

シャドウコピーを使用する場合、Assembly.Locationはシャドウコピーを指すので、CodeBaseを使用する方が適切ですが、CodeBaseはUrlです。

0
Someguy