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?
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.
Ç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;
}
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:
Donc, il semble que AppDomain.CurrentDomain.BaseDirectory
est la voie à suivre.
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.
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