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

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

ssortingng root = Application.StartupPath; 

Ou,

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

Et après ça,

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

Quelle est la meilleure façon? Y a-t-il de meilleurs moyens?

AppDomain.CurrentDomain.BaseDirectory est ma façon de procéder.

Toutefois:

Application.StartupPath obtient le répertoire de votre exécutable

AppDomain.BaseDirectory obtient le répertoire utilisé pour résoudre les assemblys

Comme ils peuvent être différents, vous voudrez peut-être utiliser Application.StartupPath, à moins que vous ne vous souciez de la résolution de l’assembly.

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

Cela n’arrive pas très souvent et vous l’auriez probablement écrit si c’était le cas, mais c’est une possibilité. Pour cette raison, je préfère spécifier l’assemblée qui m’intéresse et obtenir le répertoire à partir de cela. Ensuite, je sais que je reçois toutes les DLL dans le même répertoire que cet assembly spécifique. Par exemple, si vous avez une application MyApp.exe avec une classe MyApp.MyClass, vous devez le faire.

 ssortingng root = ssortingng.Empty; Assembly ass = Assembly.GetAssembly( typeof( MyApp.MyClass ) ); if ( ass != null ) { root = ass.Location; } 

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 certains tests simples doivent être effectués:

 var r = new List(); var s = Stopwatch.StartNew(); s.Restart(); ssortingng root1 = Application.StartupPath; r.Add(s.ElapsedTicks); s.Restart(); ssortingng root2 = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); r.Add(s.ElapsedTicks); s.Restart(); ssortingng root3 = Path.GetDirectoryName(new FileInfo(Assembly.GetExecutingAssembly().Location).FullName); r.Add(s.ElapsedTicks); s.Restart(); ssortingng root4 = AppDomain.CurrentDomain.BaseDirectory; r.Add(s.ElapsedTicks); s.Restart(); ssortingng 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.

j’utilise

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

L’assembly.Location pointera sur le cliché instantané si vous utilisez le cliché instantané, l’utilisation de CodeBase est donc une meilleure option, mais CodeBase est une URL.

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

 ssortingng path =new DirectoryInfo(Environment.CurrentDirectory).Parent.Parent.FullName