2009-07-09 30 views
6

¿Cómo sé cuál es la carpeta actual de una aplicación? Es decir ... ¿Hay alguna forma de saber dónde se encuentra el ejecutable desde el código de ejecución?Compact Framework Current Folder

gracias de antemano

Respuesta

6
string fullAppName = Assembly.GetCallingAssembly().GetName().CodeBase; 
string fullAppPath = Path.GetDirectoryName(fullAppName); 
8

Windows Mobile no tiene el concepto de una carpeta actual. La "carpeta actual" básicamente siempre está configurada para ser la raíz del sistema de archivos, sin importar dónde se encuentra su aplicación.

para obtener la ruta su aplicación se encuentra, puede utilizar Assembly.GetExecutingAssembly(), y el CodeBase propiedad o método GetName()

4

no trate de luchar contra el sistema.

Microsoft no quiere que use la carpeta de archivos de programa para nada que no sean ensamblajes. Los archivos de configuración deben ir en Datos de la aplicación, Guardar archivos y cosas similares que los usuarios deben conocer al entrar en Mis documentos.

La respuesta de jalf funcionará pero estás luchando contra el sistema. A menos que sea una buena razón por la que desee saber en qué carpeta está su ensamblaje, sugeriría que no lo haga.

2

Puede utilizar GetModuleFileName

En el ejemplo siguiente, el método GetExecutablePath devuelve la ubicación del exe, y GetStartupPath devuelve el directorio del exe.

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Text; 

class Program 
{ 
    [DllImport("coredll", SetLastError = true)] 
    public static extern uint GetModuleFileName(IntPtr hModule, StringBuilder lpFilename, [MarshalAs(UnmanagedType.U4)] int nSize); 

    [DllImport("coredll")] 
    public static extern uint FormatMessage([MarshalAs(UnmanagedType.U4)] FormatMessageFlags dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, out IntPtr lpBuffer, uint nSize, IntPtr Arguments); 

    [DllImport("coredll")] 
    public static extern IntPtr LocalFree(IntPtr hMem); 

    [Flags] 
    internal enum FormatMessageFlags : uint 
    { 
     AllocateBuffer = 256, 
     FromSystem = 4096, 
     IgnoreInserts = 512 
    } 

    public static string GetModuleFileName(IntPtr hModule) 
    { 
     StringBuilder lpFilename = new StringBuilder(short.MaxValue); 
     uint num = GetModuleFileName(hModule, lpFilename, lpFilename.Capacity); 
     if (num == 0) 
     { 
      throw CreateWin32Exception(Marshal.GetLastWin32Error()); 
     } 
     return lpFilename.ToString(); 
    } 

    private static Win32Exception CreateWin32Exception(int error) 
    { 
     IntPtr buffer = IntPtr.Zero; 
     try 
     { 
      if (FormatMessage(FormatMessageFlags.IgnoreInserts | FormatMessageFlags.FromSystem | FormatMessageFlags.AllocateBuffer, IntPtr.Zero, (uint)error, 0, out buffer, 0, IntPtr.Zero) == 0) 
      { 
       return new Win32Exception(); 
      } 
      return new Win32Exception(error, Marshal.PtrToStringUni(buffer)); 
     } 
     finally 
     { 
      if (buffer != IntPtr.Zero) 
      { 
       LocalFree(buffer); 
      } 
     } 
    } 

    public static string GetStartupPath() 
    { 
     return Path.GetDirectoryName(GetExecutablePath()); 
    } 

    public static string GetExecutablePath() 
    { 
     return GetModuleFileName(IntPtr.Zero); 
    } 
} 
+0

Ese es un martillo muy grande para una uña tan pequeña. – ctacke

2

El siguiente es correcta.

string fullAppName = Assembly.GetCallingAssembly().GetName().CodeBase; 
fullAppPath = Path.GetDirectoryName(fullAppName);
Para obtener el código equivalente en otros idiomas Consulte este link

Cuestiones relacionadas