Como encontro o caminho do aplicativo em um aplicativo de console?
No Windows Forms , posso usar Application.StartupPath
para encontrar o caminho atual, mas isso não parece estar disponível em um aplicativo de console.
c#
.net
console
console-application
JSmyth
fonte
fonte
Respostas:
System.Reflection.Assembly.GetExecutingAssembly()
. 1Location
Combine isso com
System.IO.Path.GetDirectoryName
se tudo o que você deseja é o diretório.fonte
GetExecutingAssembly
retorna assembly que contém o código que está sendo executado no momento . Isso pode não ser necessariamente o assembly .exe do console . Pode ser uma montagem que foi carregada de um local totalmente diferente. Você terá que usarGetEntryAssembly
! Observe também queCodeBase
pode não ser definido quando a montagem está no GAC. A melhor alternativa éAppDomain.CurrentDomain.BaseDirectory
.Você pode usar o código a seguir para obter o diretório atual do aplicativo.
fonte
BaseDirectory
pode ser definido em tempo de execução? Só tem um getter.Você tem duas opções para encontrar o diretório do aplicativo, que você escolher dependerá do seu objetivo.
fonte
var localDirectory = new Uri(directory).LocalPath;
Provavelmente um pouco tarde, mas vale a pena mencionar:
Ou, mais corretamente, para obter apenas o caminho do diretório:
Editar:
Muitas pessoas apontaram que
GetCommandLineArgs
não é garantido o retorno do nome do programa. Consulte A primeira palavra na linha de comando é o nome do programa apenas por convenção . O artigo afirma que "Embora extremamente poucos programas do Windows usem essa peculiaridade (eu não conheço nenhum deles)". Portanto, é possível 'falsificar'GetCommandLineArgs
, mas estamos falando de um aplicativo de console. Aplicativos de console geralmente são rápidos e sujos. Então isso se encaixa na minha filosofia do KISS.fonte
Para qualquer pessoa interessada em aplicativos da web asp.net. Aqui estão os meus resultados de 3 métodos diferentes
resultado
o aplicativo está sendo executado fisicamente em "C: \ inetpub \ SBSPortal_staging", portanto a primeira solução definitivamente não é apropriada para aplicativos da web.
fonte
A resposta acima foi de 90% do que eu precisava, mas retornou um Uri em vez de um caminho regular para mim.
Conforme explicado na postagem dos fóruns do MSDN, como converter o caminho do URI em caminho de arquivo normal? , Usei o seguinte:
fonte
File.CreateDirectory(path)
, ele vai te dar a ressalva de que ele não permite caminhos URI ...#
caractere). O identificador e tudo o que segue são truncados do caminho resultante.new Uri
eSystem.IO.Path.GetDirectoryName
? Isso fornece uma string de caminho normal em vez de aUri
.Você pode fazer isso:
fonte
você pode usar este aqui.
fonte
Se você estiver procurando uma maneira compatível com o .NET Core, use
Isso foi introduzido no .NET Framework 4.6 e .NET Core 1.0 (e .NET Standard 1.3). Consulte: Propriedade AppContext.BaseDirectory .
De acordo com esta página ,
fonte
Process.GetCurrentProcess().MainModule.FileName
Para aplicativos de console, você pode tentar o seguinte:
Saída (na minha máquina local):
Ou você pode tentar (há uma barra invertida adicional no final):
Resultado:
fonte
BaseDirectory
pode ser definido em tempo de execução. NÃO é garantido que esteja correto"Eu usei esse código e obtenha a solução.
fonte
Você pode simplesmente adicionar às referências do seu projeto
System.Windows.Forms
e usar oSystem.Windows.Forms.Application.StartupPath
normalmente.Portanto, não é necessário métodos mais complicados ou usar a reflexão.
fonte
A linha a seguir fornecerá um caminho de aplicativo:
A solução acima está funcionando corretamente nas seguintes situações:
mkbundle
pacotes configuráveis do Mono (nenhum outro método funciona)fonte
Eu uso isso se o exe deve ser chamado clicando duas vezes nele
fonte
Eu tenho usado
quando eu quero encontrar um caminho relativo a uma pasta de aplicativos. Isso funciona para aplicativos ASP.Net e winform. Também não requer nenhuma referência aos assemblies System.Web.
fonte
Quero dizer, por que não ap / invocar método?
Você o usaria como o Application.StartupPath:
fonte
Assembly.GetEntryAssembly().Location
ouAssembly.GetExecutingAssembly().Location
Use em combinação com
System.IO.Path.GetDirectoryName()
para obter apenas o diretório.Os caminhos de
GetEntryAssembly()
eGetExecutingAssembly()
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 voltarnull
se o módulo de entrada é não gerenciado (ou seja, C ++ ou executável VB6). Nesses casos, é possível usar aGetModuleFileName
partir da API do Win32:fonte
em VB.net
funciona para mim (Tipo de aplicativo: Biblioteca de classes). Não tenho certeza sobre C # ... Retorna o caminho sem o nome do arquivo como sequência
fonte
Resolverá o problema para consultar os arquivos de referência de terceiros com pacotes de instalação.
fonte
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 e não o exe real.
Portanto, pode usar QueryFullProcessImageName para contornar isso:
fonte
Experimente esta simples linha de código:
fonte
Outra solução é usar caminhos relativos que apontam para o caminho atual:
fonte
Não vi ninguém converter o LocalPath fornecido pelo .Net Core em um caminho System.IO utilizável, então aqui está minha versão.
Isso retornará o caminho formatado "C: \ xxx \ xxx" completo para onde está o seu código.
fonte
Existem muitas maneiras de obter o caminho executável, e qual deles devemos usar depende de nossas necessidades. Aqui está um link que discute métodos diferentes.
Maneiras diferentes de obter o caminho executável do aplicativo
fonte
Aqui está uma solução confiável que funciona com 32 bits e 64 bits aplicativos de .
Adicione estas referências:
Adicione este método ao seu projeto:
Agora use-o assim:
Observe que, se você souber o ID do processo, esse método retornará o ExecutePath correspondente.
Extra, para os interessados:
... fornecerá uma matriz de todos os processos em execução no momento e ...
... fornecerá o processo atual, juntamente com suas informações, por exemplo, ID, etc., e também controle limitado, por exemplo, Kill, etc. *
fonte
Você pode criar um nome de pasta como Recursos no projeto usando o Gerenciador de Soluções e colar um arquivo nos Recursos.
fonte