アプリケーションのルートディレクトリにあるすべてのdllを取得する必要があります。それを行う最良の方法は何ですか?
string root = Application.StartupPath;
または、
string root = new FileInfo(Assembly.GetExecutingAssembly().Location).FullName;
それとその後、
Directory.GetFiles(root, "*.dll");
どちらの方法が良いですか?より良い方法はありますか?
AppDomain.CurrentDomain.BaseDirectory
はそうするための私のやり方です。
しかしながら:
Application.StartupPath
は、実行可能ファイルのディレクトリを取得します
AppDomain.BaseDirectory
は、アセンブリの解決に使用されるディレクトリを取得します
これらは異なる可能性があるため、アセンブリの解決を気にしない限り、おそらくApplication.StartupPathを使用したいでしょう。
場合によります。アプリケーションを起動したEXEのディレクトリが必要な場合は、2つの例のいずれかが機能します。 。
それはあまり頻繁に起こることではなく、もしそうなら書かれていただろうが、可能性はある。そのため、興味のあるアセンブリを指定し、そこからディレクトリを取得することを好みます。その後、その特定のアセンブリと同じディレクトリにすべてのDLLを取得していることを知っています。たとえば、クラスがMyApp.MyClassであるアプリケーションMyApp.exeがある場合、これを実行します。
string root = string.Empty;
Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) );
if ( ass != null )
{
root = ass.Location;
}
これは古い質問ですが、私はいつも使用していました:
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);
ティックの結果:
そうらしい、それっぽい AppDomain.CurrentDomain.BaseDirectory
は進むべき道です。
アプリケーションのルートフォルダパスを取得する場合は、以下のコードサンプルを使用します。
string path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName
私が使う
Path.GetDirectoryName(new Uri(Assembly.GetEntryAssembly().CodeBase).LocalPath)
シャドウコピーを使用する場合、Assembly.Locationはシャドウコピーを指すので、CodeBaseを使用する方が適切ですが、CodeBaseはUrlです。