web-dev-qa-db-fra.com

Quel est le meilleur moyen de déterminer le répertoire racine de l'application?

Je dois obtenir toutes les dll dans le répertoire racine de mon application. Quelle est la meilleure façon de le faire?

string root = Application.StartupPath;

Ou,

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

Et après ça,

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

Quel est le meilleur chemin? Y a-t-il de meilleurs moyens?

48
abatishchev

AppDomain.CurrentDomain.BaseDirectory est ma façon d'aller de l'avant.

Toutefois:

Application.StartupPath récupère le répertoire de votre exécutable

AppDomain.BaseDirectory récupère le répertoire utilisé pour résoudre les assemblys

Comme ils peuvent être différents, vous pouvez peut-être utiliser Application.StartupPath, sauf si vous vous souciez de la résolution de l'Assemblée.

65
Greg Dean

Ça dépend. Si vous voulez le répertoire du fichier EXE qui a lancé l'application, l'un ou l'autre de vos deux exemples fonctionnera. Rappelez-vous cependant que .NET est très flexible et qu’une autre application peut se lier à votre fichier EXE et l’appelle, éventuellement à partir d’un autre répertoire.

Cela n'arrive pas très souvent et vous auriez probablement écrit si c'était le cas, mais c'est une possibilité. A cause de cela, je préfère spécifier quelle assemblée m'intéresse et obtenir le répertoire à partir de cela. Ensuite, je sais que toutes les DLL se trouvent dans le même répertoire que cet assemblage spécifique. Par exemple, si vous avez une application MyApp.exe avec une classe dans MyApp.MyClass, procédez comme suit:

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

C'est une vieille question, mais j'ai toujours utilisé:

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

Cependant, en regardant les solutions ici, je pense que quelques tests simples doivent être effectués:

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);

Les résultats en ticks:

  • 49
  • 306
  • 166
  • 26
  • 201

Donc, il semble que AppDomain.CurrentDomain.BaseDirectory est la voie à suivre.

5
eried

J'utilise

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

Assembly.Location pointe sur le cliché instantané si vous utilisez le cliché instantané. CodeBase est donc une meilleure option, mais CodeBase est une URL.

0
Someguy

Si vous souhaitez obtenir le chemin du dossier racine de l'application, utilisez l'exemple de code ci-dessous.

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