Qual è il modo migliore per determinare la directory root dell’applicazione?

Ho bisogno di ottenere tutte le DLL nella directory principale dell’applicazione. Qual è il modo migliore per farlo?

string root = Application.StartupPath; 

O,

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

Dopodiché,

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

Qual è il modo migliore? Ci sono modi migliori?

AppDomain.CurrentDomain.BaseDirectory è il mio modo di farlo.

Però:

Application.StartupPath ottiene la directory del tuo eseguibile

AppDomain.BaseDirectory ottiene la directory utilizzata per risolvere gli assembly

Dal momento che possono essere diversi, forse si desidera utilizzare Application.StartupPath, a meno che non ci si preoccupi della risoluzione dell’assembly.

Dipende. Se si desidera la directory dell’EXE che ha avviato l’applicazione, funzionerà uno dei due esempi. Ricorda però che .NET è molto flessibile e potrebbe essere che un’altra applicazione sia collegata al tuo EXE e la stia chiamando, probabilmente da un’altra directory.

Ciò non accade molto spesso e probabilmente lo avresti scritto, ma è una possibilità. Per questo motivo, preferisco specificare a quale assembly sono interessato e ottenere la directory da quella. Quindi so che sto recuperando tutte le DLL nella stessa directory di quel assembly specifico. Ad esempio, se hai un’applicazione MyApp.exe con una class in MyApp.MyClass, allora dovresti farlo;

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

Questa è una vecchia domanda, ma ho sempre usato:

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

Tuttavia, osservando le soluzioni qui riportate, ritengo che debbano essere fatti alcuni semplici test:

 var r = new List(); 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); 

I risultati in zecche:

  • 49
  • 306
  • 166
  • 26
  • 201

Quindi sembra che AppDomain.CurrentDomain.BaseDirectory sia la strada da percorrere.

Io uso

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

L’Assembly.Location punterà alla copia shadow se usi la copia shadow, quindi usare CodeBase è un’opzione migliore, ma CodeBase è un Url.

Se si desidera ottenere il percorso della cartella radice dell’applicazione, utilizzare il seguente esempio di codice.

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