net - visual studio mac c#




Como posso obter o caminho do aplicativo em um aplicativo de console do.NET? (18)

Como faço para encontrar o caminho do aplicativo em um aplicativo de console?

No Windows Forms , eu posso usar Application.StartupPath para encontrar o caminho atual, mas isso não parece estar disponível em um aplicativo de console.


A linha a seguir fornecerá um caminho de aplicativo:

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

A solução acima está funcionando corretamente nas seguintes situações:

  • aplicativo simples
  • em outro domínio onde Assembly.GetEntryAssembly () retornaria null
  • DLL é carregada de recursos incorporados como matriz de bytes e carregada para AppDomain como Assembly.Load (byteArrayOfEmbeddedDll)

A resposta acima foi de 90% do que eu precisava, mas retornei um Uri ao invés de um caminho regular para mim.

Como explicado no post de fóruns do MSDN, Como converter o caminho do URI para o caminho de arquivo normal? Eu usei o seguinte:

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

Eu não vi ninguém converter o LocalPath fornecido pelo reflexo do .Net Core em um caminho System.IO utilizável, então aqui está minha versão.

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

   return new FileInfo(exePath).DirectoryName;

}

Isso retornará o caminho formatado "C: \ xxx \ xxx" completo para onde seu código está.


Eu tenho usado

System.AppDomain.CurrentDomain.BaseDirectory

quando quero encontrar um caminho relativo a uma pasta de aplicativos. Isso funciona para aplicativos ASP.Net e winform. Também não requer qualquer referência a assemblies System.Web.


Eu uso isso se o exe deve ser chamado clicando duas vezes nele

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

Experimente esta linha simples de código:

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

Nenhum desses métodos funciona em casos especiais como o uso de um link simbólico para o exe, eles retornarão a localização do link não o exe real.

Então, pode usar QueryFullProcessImageName para contornar isso:

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

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags, [Out]StringBuilder lpExeName, ref int lpdwSize);

    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern IntPtr OpenProcess(
        UInt32 dwDesiredAccess,
        [MarshalAs(UnmanagedType.Bool)]
        Boolean bInheritHandle,
        Int32 dwProcessId
    );
}

public static class utils
{

    private const UInt32 PROCESS_QUERY_INFORMATION = 0x400;
    private const UInt32 PROCESS_VM_READ = 0x010;

    public static string getfolder()
    {
        Int32 pid = Process.GetCurrentProcess().Id;
        int capacity = 2000;
        StringBuilder sb = new StringBuilder(capacity);
        IntPtr proc;

        if ((proc = NativeMethods.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pid)) == IntPtr.Zero)
            return "";

        NativeMethods.QueryFullProcessImageName(proc, 0, sb, ref capacity);

        string fullPath = sb.ToString(0, capacity);

        return Path.GetDirectoryName(fullPath) + @"\";
    }
}

Para aplicativos de console, você pode tentar isso:

System.IO.Directory.GetCurrentDirectory();

Saída (na minha máquina local):

c: \ users \ xxxxxxx \ documentos \ visual studio 2012 \ Projetos \ ImageHandler \ GetDir \ bin \ Debug

Ou você pode tentar (há uma barra invertida adicional no final):

AppDomain.CurrentDomain.BaseDirectory

Saída:

c: \ users \ xxxxxxx \ documentos \ visual studio 2012 \ Projetos \ ImageHandler \ GetDir \ bin \ Debug \


Provavelmente um pouco atrasado, mas vale a pena mencionar:

Environment.GetCommandLineArgs()[0];

Ou, mais corretamente, para obter apenas o caminho do diretório:

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

Editar:

Algumas pessoas apontaram que não é garantido que GetCommandLineArgs retorne o nome do programa. Veja A primeira palavra na linha de comando é o nome do programa apenas por convenção . O artigo afirma que "Embora muito poucos programas do Windows usem essa peculiaridade (não estou ciente de nenhum eu mesmo)". Portanto, é possível 'spoof' GetCommandLineArgs , mas estamos falando de um aplicativo de console. Aplicativos de console geralmente são rápidos e sujos. Então isso se encaixa com a minha filosofia KISS.


Quero dizer, porque não ap / invocar método?

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

Você iria usá-lo apenas como o Application.StartupPath:

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

Você pode criar um nome de pasta como Recursos no projeto usando o Solution Explorer e, em seguida, pode colar um arquivo nos Recursos.

private void Form1_Load(object sender, EventArgs e) {
    string appName = Environment.CurrentDirectory;
    int l = appName.Length;
    int h = appName.LastIndexOf("bin");
    string ll = appName.Remove(h);                
    string g = ll + "Resources\\sample.txt";
    System.Diagnostics.Process.Start(g);
}

Você pode estar procurando fazer isso:

System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

Você pode usar o seguinte código para obter o diretório atual do aplicativo.

AppDomain.CurrentDomain.BaseDirectory

Você pode usar o seguinte código, você receberá o caminho completo do aplicativo:

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

em VB.net

My.Application.Info.DirectoryPath

funciona para mim (tipo de aplicativo: biblioteca de classes). Não tenho certeza sobre C # ... Retorna o caminho sem o nome do arquivo como string


você pode usar este em vez disso.

System.Environment.CurrentDirectory

Assembly.GetEntryAssembly().Location ou Assembly.GetExecutingAssembly().Location

Use em combinação com System.IO.Path.GetDirectoryName() para obter apenas o diretório.

Os caminhos de GetEntryAssembly() e GetExecutingAssembly() podem ser diferentes, embora na maioria dos casos o diretório seja o mesmo.

Com GetEntryAssembly() você tem que estar ciente de que isso pode retornar null se o módulo de entrada não for gerenciado (ou seja, executável C ++ ou VB6). Nesses casos, é possível usar GetModuleFileName da API do Win32:

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

AppDomain.CurrentDomain.BaseDirectory

Resolverá o problema para referenciar os arquivos de referência de terceiros com pacotes de instalação.





console-application