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:
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