remarks cref c# .net winforms

cref - remarks c#



¿Cuál es la mejor manera de determinar el directorio raíz de la aplicación? (5)

Necesito obtener todos los dlls en mi directorio raíz de la aplicación. ¿Cuál es la mejor manera de hacer eso?

string root = Application.StartupPath;

O,

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

Y después de eso,

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

¿Qué camino es mejor? ¿Hay mejores formas?


Depende. Si desea el directorio del EXE que inició la aplicación, cualquiera de sus dos ejemplos funcionará. Sin embargo, recuerde que .NET es muy flexible, y podría ser que otra aplicación se haya vinculado a su EXE y lo esté llamando, posiblemente desde otro directorio.

Eso no sucede muy a menudo y probablemente hubieras escrito si lo hiciera, pero es una posibilidad. Por eso, prefiero especificar qué ensamblaje me interesa y obtener el directorio de eso. Entonces sé que estoy recibiendo todas las DLL en el mismo directorio que ese ensamblaje específico. Por ejemplo, si tiene una aplicación MyApp.exe con una clase en MyApp.MyClass, entonces haría esto;

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


Esta es una vieja pregunta, pero siempre solía usar:

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

Sin embargo, mirando las soluciones aquí, creo que algunas pruebas simples deben hacerse:

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

Los resultados en ticks:

  • 49
  • 306
  • 166
  • 26
  • 201

Entonces, parece que AppDomain.CurrentDomain.BaseDirectory es el camino a seguir.


Si desea obtener la ruta de la carpeta raíz de la aplicación, utilice el ejemplo de código siguiente.

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


yo suelo

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

Assembly.Location apuntará a la instantánea si utiliza el copiado oculto, por lo que usar CodeBase es una mejor opción, pero CodeBase es una Url.


AppDomain.CurrentDomain.BaseDirectory es mi forma de hacerlo.

Sin embargo:

Application.StartupPath obtiene el directorio de tu ejecutable

AppDomain.BaseDirectory obtiene el directorio utilizado para resolver ensamblajes

Como pueden ser diferentes, quizás desee utilizar Application.StartupPath, a menos que le interese la resolución de ensamblaje.