writeline - imprimir en consola c#




¿Cómo puedo obtener la ruta de la aplicación en una aplicación de consola.NET? (18)

Aquí hay una solución confiable que funciona con aplicaciones de 32 bits y 64 bits .

Añade estas referencias:

utilizando System.Diagnostics;

utilizando System.Management;

Agrega este método a tu proyecto:

public static string GetProcessPath(int processId)
{
    string MethodResult = "";
    try
    {
        string Query = "SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;

        using (ManagementObjectSearcher mos = new ManagementObjectSearcher(Query))
        {
            using (ManagementObjectCollection moc = mos.Get())
            {
                string ExecutablePath = (from mo in moc.Cast<ManagementObject>() select mo["ExecutablePath"]).First().ToString();

                MethodResult = ExecutablePath;

            }

        }

    }
    catch //(Exception ex)
    {
        //ex.HandleException();
    }
    return MethodResult;
}

Ahora utilízalo así:

int RootProcessId = Process.GetCurrentProcess().Id;

GetProcessPath(RootProcessId);

Tenga en cuenta que si conoce el ID del proceso, este método devolverá el ExecutePath correspondiente.

Extra, para los interesados:

Process.GetProcesses() 

... le dará una matriz de todos los procesos actualmente en ejecución, y ...

Process.GetCurrentProcess()

... le dará el proceso actual, junto con su información, por ejemplo, Id, etc. y también control limitado, por ejemplo, Kill, etc. *

¿Cómo encuentro la ruta de la aplicación en una aplicación de consola?

En Windows Forms , puedo usar Application.StartupPath para encontrar la ruta actual, pero esto no parece estar disponible en una aplicación de consola.



La respuesta anterior fue el 90% de lo que necesitaba, pero me devolvió un Uri en lugar de un camino normal.

Como se explica en la publicación de los foros de MSDN, ¿Cómo convertir la ruta URI a la ruta de archivo normal? , Utilicé lo siguiente:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;

La siguiente línea le dará una ruta de aplicación:

var applicationPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

La solución anterior funciona correctamente en las siguientes situaciones:

  • aplicación simple
  • en otro dominio donde Assembly.GetEntryAssembly () devolvería null
  • La DLL se carga desde los recursos incrustados como matriz de bytes y se carga en el dominio de aplicación como Assembly.Load (byteArrayOfEmbeddedDll)

No vi a nadie convertir el LocalPath provisto por el reflejo de .Net Core en una ruta utilizable de System.IO, así que aquí está mi versión.

public static string GetApplicationRoot()
{
   var exePath = new Uri(System.Reflection.
   Assembly.GetExecutingAssembly().CodeBase).LocalPath;

   return new FileInfo(exePath).DirectoryName;

}

Esto devolverá la ruta completa con formato "C: \ xxx \ xxx" a donde se encuentra su código.


Para aplicaciones de consola, puede probar esto:

System.IO.Directory.GetCurrentDirectory();

Salida (en mi máquina local):

c: \ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug

O puedes probar (hay una barra invertida adicional al final):

AppDomain.CurrentDomain.BaseDirectory

Salida:

c: \ users \ xxxxxxx \ documents \ visual studio 2012 \ Projects \ ImageHandler \ GetDir \ bin \ Debug \


Probablemente un poco tarde pero vale la pena mencionar:

Environment.GetCommandLineArgs()[0];

O más correctamente para obtener solo la ruta del directorio:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

Editar:

Algunas personas han señalado que GetCommandLineArgs no garantiza devolver el nombre del programa. Ver La primera palabra en la línea de comando es el nombre del programa solo por convención . El artículo afirma que "aunque muy pocos programas de Windows usan esta peculiaridad (no conozco ninguno)". Por lo tanto, es posible 'simular' GetCommandLineArgs , pero estamos hablando de una aplicación de consola. Las aplicaciones de la consola suelen ser rápidas y sucias. Así que esto encaja con mi filosofía KISS.


Prueba esta simple línea de código:

 string exePath = Path.GetDirectoryName( Application.ExecutablePath);

Puede usar el siguiente código para obtener el directorio de la aplicación actual.

AppDomain.CurrentDomain.BaseDirectory

Puedes usar el siguiente código, obtendrás la ruta completa de la aplicación:

 class Program
{
    static void Main(string[] args)
    {
        string AppPath = System.Reflection.Assembly.GetExecutingAssembly().Location;
        WriteLine($"ApplicationPath ---{AppPath}");
        //OutPut// //ApplicationPath---C:\Users\TestUser\source\repos\ThreadStack\ThreadStack\bin\Debug\ThreadStack.exe
        ReadLine();
    }
}  

Quiero decir, ¿por qué no ap / método invocar?

    using System;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    public class AppInfo
    {
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = false)]
            private static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);
            private static HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);
            public static string StartupPath
            {
                get
                {
                    StringBuilder stringBuilder = new StringBuilder(260);
                    GetModuleFileName(NullHandleRef, stringBuilder, stringBuilder.Capacity);
                    return Path.GetDirectoryName(stringBuilder.ToString());
                }
            }
    }

Lo utilizarías igual que Application.StartupPath:

    Console.WriteLine("The path to this executable is: " + AppInfo.StartupPath + "\\" + System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe");

Si está buscando una forma compatible con .NET Core, use

System.AppContext.BaseDirectory

Esto se introdujo en .NET Framework 4.6 y .NET Core 1.0 (y .NET Standard 1.3). Ver: AppContext.BaseDirectory Property .

Según esta página ,

Este es el reemplazo preferido para AppDomain.CurrentDomain.BaseDirectory en .NET Core


Tiene dos opciones para encontrar el directorio de la aplicación, que elija dependerá de su propósito.

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);

Uso esto si se supone que el exe debe llamarse haciendo doble clic en él

var thisPath = System.IO.Directory.GetCurrentDirectory();

en vb.net

My.Application.Info.DirectoryPath

trabaja para mí (Tipo de aplicación: Class Library). No estoy seguro acerca de C # ... Devuelve la ruta sin el nombre de archivo como una cadena


he utilizado

System.AppDomain.CurrentDomain.BaseDirectory

cuando quiero encontrar una ruta relativa a una carpeta de aplicaciones. Esto funciona tanto para aplicaciones ASP.Net como para winform. Tampoco requiere ninguna referencia a los ensamblados de System.Web.


Assembly.GetEntryAssembly().Location o Assembly.GetExecutingAssembly().Location

Úselo en combinación con System.IO.Path.GetDirectoryName() para obtener solo el directorio.

Las rutas de GetEntryAssembly() y GetExecutingAssembly() pueden ser diferentes, aunque en la mayoría de los casos el directorio será el mismo.

Con GetEntryAssembly() tener en cuenta que esto puede devolver null si el módulo de entrada no está administrado (es decir, ejecutable de C ++ o VB6). En esos casos es posible usar GetModuleFileName desde la API de Win32:

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetModuleFileName(HandleRef hModule, StringBuilder buffer, int length);

AppDomain.CurrentDomain.BaseDirectory

Resolverá el problema para referir los archivos de referencia de terceros con paquetes de instalación.





console-application