Como obtenho o nome do executável atual em c #?

355

Quero obter o nome do programa em execução no momento, que é o nome do executável do programa. Em C / C ++, você obtém args[0].

Joakim
fonte
Executável é um arquivo EXE (Windows Forms, aplicativos WPF)? Um programa pode ser um aplicativo de desktop (WinForms, WPF; e WinRT-Windows Phone?), Aplicativo Web, aplicativo de serviço Wcf, suplemento Visual Studio, suplemento Outlook-Word, teste de unidade no VS (MSTest) ou aplicativo Silverlight.
27514 Kiquenet

Respostas:

405
System.AppDomain.CurrentDomain.FriendlyName
Steven A. Lowe
fonte
61
Cuidado com a resposta aceita. Ocorreu um problema ao usar os System.AppDomain.CurrentDomain.FriendlyNameaplicativos implantados Click-Once. Para nós, isso está retornando " DefaultDomain ", e não o nome do exe original.
Gaspode
40
Usamos isso no final:string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
Gaspode
4
FriendlyName pode ser definido como qualquer coisa. Também não é suficiente obter o local da montagem se você tiver um exe com várias DLLs. Além disso, se você usar vários AppDomain, Assembly.GetCallingAssembly () retornará nulo.
User276648 16/05
2
@ Gaspode: seria mais fácil dizer Path.GetFileNameWithoutExtension (GetType (). Assembly.Location) - você não precisa especificar um objeto de um tipo no assembly atual. Você pode usar GetType disso e nem precisa dizer "isso".
precisa saber é o seguinte
4
Isso pode ser útil, mas deve não ser a resposta aceito: É muito diferente do que foi pedido - que irá coincidentemente ser a mesma coisa em algumas situações, mas isso é algo completamente diferente. Se você não escreveu o aplicativo, poderia muito bem retornar "Eu gosto de batatas!" ou qualquer outra coisa que seu colega bem-humorado escreveu nessa propriedade quando criou o aplicativo!
AnorZaken
237

System.AppDomain.CurrentDomain.FriendlyName - Retorna o nome do arquivo com extensão (por exemplo, MyApp.exe).

System.Diagnostics.Process.GetCurrentProcess().ProcessName- Retorna o nome do arquivo sem extensão (por exemplo, MyApp).

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName- Retorna o caminho completo e o nome do arquivo (por exemplo, C: \ Examples \ Processes \ MyApp.exe). Você pode passar isso para System.IO.Path.GetFileName()ou System.IO.Path.GetFileNameWithoutExtension()obter os mesmos resultados acima.

Lee Grissom
fonte
3
AppDomain pode ser um aplicativo EXE, um aplicativo Web, um aplicativo de teste de unidade, o Addin Visual Studio e o "Silverlight App" (?). Talvez solução completa interessante para todos os casos. Por exemplo, para Teste de unidade VS2012 - NomeDoProcesso: vstest.executionengine.x86 MainModule.FileName: C: \ ARQUIVOS DE PROGRAMA (X86) \ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName: UnitTestAdapter: Executando teste ApplicationName:
Kiquenet
Um "programa" pode ser um aplicativo de área de trabalho (WinForms, WPF; e WinRT-Windows Phone?), Aplicativo Web, aplicativo de serviço Wcf, suplemento Visual Studio, suplemento Outlook-Word, teste de unidade no VS (MSTest) ou aplicativo Silverlight . Por exemplo, como obter o assembly Host de serviço para um Aplicativo de Serviço Wcf hospedado no IIS, não no IISExpress ou no WebDevServer?
27514 Kiquenet
6
Marcarei com esta resposta porque ela fornece todas as três variações necessárias, de uma maneira limpa e simples. O uso do nome simples do programa sem caminho ou extensão é muito útil para o texto de ajuda no programa ( /?opção), porque o uso da extensão e do caminho apenas o torna desnecessário.
Synetech
2
Lembre-se de descartar o resultado deGetCurrentProcess()
Mahmoud Al-Qudsi
Process.GetCurrentProcess().ProcessName()retorna MyApp.vshost para mim.
Jonathan Wood
106

System.Diagnostics.Process.GetCurrentProcess()obtém o processo atualmente em execução. Você pode usar a ProcessNamepropriedade para descobrir o nome. Abaixo está um exemplo de aplicativo de console.

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Process.GetCurrentProcess().ProcessName);
        Console.ReadLine();
    }
}
Aaron Daniels
fonte
36
Melhor usar Process.GetCurrentProcess (). MainModule.FileName
KindDragon
Process.GetCurrentProcess (). MainModule.FileName funciona perfeitamente de dentro de um suplemento do Excel (ExcelDNA)
earcam
10
Essa abordagem falhará quando usada no tempo de execução Mono; o nome do processo para aplicativos em execução no Mono sempre será uma variante do .../bin/mono* nixes ou .../mono.exedo Windows.
Cdhowie 21/10/12
11
Essa deve ser a resposta aceita. Nome AppDomain atual pode não ter nada a ver com o nome do processo executável, especialmente quando vários domínios de aplicativos estão presentes
Ivan Krivyakov
Este método pode ser substancialmente mais lento do que jogar com a classe Assembly.
Erwin Mayer
99

Isso deve ser suficiente:

Environment.GetCommandLineArgs()[0];
James B
fonte
3
Hmm, isso retorna (quando executado a partir do vs.net e usando a coisa de hospedagem de depuração), o local e o nome do filename.vshost.exe ... que é realmente o arquivo que está sendo executado no momento)
Frederik Gheysels
13
Esta é a melhor resposta para mim, porque Environment.GetCommandLineArgs()é o análogo C # exato argvdo C / C ++.
Frederick The Fool
Acordado! melhor resposta. Eu tenho uma necessidade de obter Environment.GetCommandLineArgs () [1];
precisa
11
Para evitar o caminho completo:Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
Nathan
11
Isso funciona bem ao tentar rastrear os serviços WCF. O nome do processo volta com o iisexpress no meu caso. Mas esse comando me fornece o nome real do assembly do serviço WCF.
precisa
19

Este é o código que funcionou para mim:

string fullName = Assembly.GetEntryAssembly().Location;
string myName = Path.GetFileNameWithoutExtension(fullName);

Todos os exemplos acima me deram o processName com vshost ou o nome da dll em execução.

Tal Segal
fonte
4
Para aqueles que não sabem ou perderam em outras respostas, o espaço para nome do Assembly é System.Reflection e o espaço para nome do Path é System.IO.
amalgamar
4
GetEntryAssembly retornará nulo se o ponto de entrada do aplicativo estiver no código nativo em vez de em um assembly.
Emdot
18

Tente o seguinte:

System.Reflection.Assembly.GetExecutingAssembly()

Isso retorna uma System.Reflection.Assemblyinstância que possui todos os dados que você poderia querer saber sobre o aplicativo atual. Eu acho que a Locationpropriedade pode obter o que você procura especificamente.

Andrew Hare
fonte
6
Pode ser mais seguro usar em CodeBasevez de Location, caso o recurso de cópia de sombra do .NET esteja ativo. Veja blogs.msdn.com/suzcook/archive/2003/06/26/…
Dirk Vollmar
18
Cuidado com GetExecutingAssembly (): se você chamar isso de um assembly de biblioteca, ele retornará o nome do assembly de biblioteca, que é diferente do nome do assembly de entrada (ou seja, o executável original). Se você usar GetEntryAssembly (), ele retornará o nome do executável real, mas lançará uma exceção se o processo estiver sendo executado no WCF (reconhecidamente uma situação rara). Para o código mais robusto, use Process.GetCurrentProcess (). ProcessName.
Contango
@ Gravitas: Certamente não, qualquer executável que esteja executando "interpretado", por exemplo, com / usr / bin / mono, terá o nome do processo errado. O ProcessName também não funcionará com os serviços do Windows. Se você usá-lo em uma biblioteca, use GetCallingAssembly.
Stefan Steiger
11
Trabalhou para mim. A propriedade Nome da chamada GetName () da instância do Assembly retornada é o que você precisa e não inclui a parte ".exe". Também testado em Mono / Linux com resultado esperado. . Assembly.GetName () Nome
Hatoru Hansou
11
Hmm, observe que a string retornada não será alterada, mesmo que você renomeie o arquivo executável manualmente usando o explorador de arquivos. Enquanto Environment.GetCommandLineArgs () [0] muda junto com o nome do arquivo executável real (é claro). Coincidentemente, o segundo método resultou melhor para minha situação específica, pois quero que a pasta de dados seja nomeada como o nome do arquivo executável real.
Hatoru Hansou 23/01
11
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

dará a você o nome do arquivo do seu aplicativo; "MyApplication.exe"

Teoman shipahi
fonte
11

Por que ninguém sugeriu isso, é simples.

Path.GetFileName(Application.ExecutablePath)
xmen
fonte
3
Qual namespace reside o Application.
Jeetendra
6
Isto é útil quando dentro de um aplicativo de formulários do Windows, mas sem qualquer outro
NineBerry
@NineBerry você poderia estar interessado em Application.ExecutablePath's código fonte .
Spooky
@NineBerry Veja meu post. Isso funciona nos aplicativos de console se você adicionar uma referência ao System.Windows.Forms.
John
10

Mais algumas opções:

  • System.Reflection.Assembly.GetExecutingAssembly().GetName().Name
  • Path.GetFileName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
JohnB
fonte
9

Se você precisar do nome do programa para configurar uma regra de firewall, use:

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName

Isso garantirá que o nome esteja correto ao depurar no VisualStudio e ao executar o aplicativo diretamente no Windows.

Mark Uebel
fonte
2
Para meus propósitos (criar um nome de arquivo de log), esta é a melhor resposta. Se estiver executando um processo hospedado (por exemplo, um serviço ou aplicativo da Web), o System.AppDomain.CurrentDomain.FriendlyName poderá retornar um nome GUID-y feio com barras incorporadas.
Curt
8

Quando incerto ou em dúvida, corra em círculos, grite e grite.

class Ourself
{
    public static string OurFileName() {
        System.Reflection.Assembly _objParentAssembly;

        if (System.Reflection.Assembly.GetEntryAssembly() == null)
            _objParentAssembly = System.Reflection.Assembly.GetCallingAssembly();
        else
            _objParentAssembly = System.Reflection.Assembly.GetEntryAssembly();

        if (_objParentAssembly.CodeBase.StartsWith("http://"))
            throw new System.IO.IOException("Deployed from URL");

        if (System.IO.File.Exists(_objParentAssembly.Location))
            return _objParentAssembly.Location;
        if (System.IO.File.Exists(System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName))
            return System.AppDomain.CurrentDomain.BaseDirectory + System.AppDomain.CurrentDomain.FriendlyName;
        if (System.IO.File.Exists(System.Reflection.Assembly.GetExecutingAssembly().Location))
            return System.Reflection.Assembly.GetExecutingAssembly().Location;

        throw new System.IO.IOException("Assembly not found");
    }
}

Não posso afirmar que testei cada opção, mas não faz nada estúpido como retornar o vhost durante as sessões de depuração.

Orwellophile
fonte
2
+1 por diversão. :-) Eu dificilmente usaria esse código, a menos que esteja escrevendo uma biblioteca realmente genérica que não tenha idéia do ambiente (e provavelmente não seria uma boa ideia manter qualquer estado global que você usasse o nome para).
Andrey Tarantsov 22/03
@Orwellophile Um "programa" pode ser um aplicativo de desktop (WinForms, WPF; e WinRT-Windows Phone?), Aplicativo Web, aplicativo de serviço Wcf, suplemento Visual Studio, suplemento Outlook-Word, teste unitário em VS (MSTest) ou, Aplicativo Silverlight. Por exemplo, como obter o assembly Host de serviço para um Aplicativo de Serviço Wcf hospedado no IIS, não no IISExpress ou no WebDevServer? Qualquer código completo válido para um WinForms, WPF, aplicativo Web, aplicativo de serviço Wcf, suplemento Visual Studio, suplemento Outlook-Word, teste de unidade em aplicativos VS (MSTest)?
27514 Kiquenet
8
  • System.Reflection.Assembly.GetEntryAssembly().Location retorna a localização do nome do exe se o assembly não for carregado da memória.
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase retorna o local como URL.
Langpavel
fonte
Testado, isso funciona 100%, mesmo que seja chamado de dentro de uma biblioteca C #.
Contango 3/11
11
GetEntryAssembly () retorna nulo se você não estiver no AppDomain principal.
User276648
4

Se você está procurando as informações completas do caminho do seu executável, a maneira confiável de fazer isso é usar o seguinte:

   var executable = System.Diagnostics.Process.GetCurrentProcess().MainModule
                       .FileName.Replace(".vshost", "");

Isso elimina quaisquer problemas com dlls intermediárias, vshost etc.

theMayer
fonte
Eu tentei sua maneira confiável no Ubuntu Linux 15.10 C ++ usando o realpath seguido pela substituição da string STL C ++ e causou a falha do Point and Click. Isso poderia ter sido causado por um bug mono, como supôs hoje nosso diretor de software? Obrigado.
19416 Frank
Eu não programar em Mono, embora possa ser divertido tentar
theMayer
Gasponde escreveu acima que "Tivemos problemas com o uso de System.AppDomain.CurrentDomain.FriendlyName em aplicativos implantados Click-Once." Você poderia adivinhar quais seriam os problemas com os aplicativos implantados Click-Once no .NET? Obrigado.
19416 Frank
Retorna C: \ Arquivos de programas \ dotnet \ dotnet.exe para o meu programa de amostra no VS2017.
jwdonahue 2/09/19
3

Você pode usar Environment.GetCommandLineArgs()para obter os argumentos e Environment.CommandLineobter a linha de comando real conforme inserida.

Além disso, você pode usar Assembly.GetEntryAssembly()ou Process.GetCurrentProcess().

No entanto, ao depurar, você deve ter cuidado, pois este exemplo final pode fornecer o nome do executável do depurador (dependendo de como você anexa o depurador) ao invés do executável, como os outros exemplos.

Jeff Yates
fonte
4
Cuidado com GetExecutingAssembly (): se você chamar isso de um assembly de biblioteca, ele retornará o nome do assembly de biblioteca, que é diferente do nome do assembly de entrada (ou seja, o executável original). Se você usar GetEntryAssembly (), ele retornará o nome do executável real, mas lançará uma exceção se o processo estiver sendo executado no WCF (reconhecidamente uma situação rara). Para o código mais robusto, use Process.GetCurrentProcess (). ProcessName.
Contango
@Gravitas: bom ponto - uau, já faz um tempo desde que escrevi isso! : D editarei em conformidade #
911 Jeff Yates
Environment.CommandLinefornece o caminho absoluto, não a linha de comando inserida, pelo menos no Mono / Linux.
Caracol mecânico
@ Mecanicalsnail: Parece que o Mono não segue completamente a documentação. Interessante.
Jeff Yates
1

É isso que voce quer:

Assembly.GetExecutingAssembly ().Location
Frederik Gheysels
fonte
4
Cuidado com GetExecutingAssembly (): se você chamar isso de um assembly de biblioteca, ele retornará o nome do assembly de biblioteca, que é diferente do nome do assembly de entrada (ou seja, o executável original). Se você usar GetEntryAssembly (), ele retornará o nome do executável real, mas lançará uma exceção se o processo estiver sendo executado no WCF (reconhecidamente uma situação rara). Para o código mais robusto, use Process.GetCurrentProcess (). ProcessName.
Contango
Uma resposta não deve ser uma pergunta. É isso que o OP queria?
jwdonahue 2/09/19
1

No .Net Core (ou Mono), a maioria das respostas não se aplica quando o binário que define o processo é o binário de tempo de execução do Mono ou .Net Core (dotnet) e não o aplicativo real em que você está interessado. , usa isto:

var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);
Tobias
fonte
11
GetEntryAssembly()pode retornar nulo.
user2864740
1

Para aplicativos do Windows (formulários e console), uso este:

Adicione uma referência ao System.Windows.Forms no VS e, em seguida:

using System.Windows.Forms;
namespace whatever
{
    class Program
    {
        static string ApplicationName = Application.ProductName.ToString();
        static void Main(string[] args)
        {
            ........
        }
    }
}

Isso funciona corretamente para mim, esteja eu executando o executável real ou depurando no VS.

Observe que ele retorna o nome do aplicativo sem a extensão.

John

John
fonte
1

Super fácil, aqui:

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName
Fantasma delirante
fonte
11
Para o .NET Core Process.GetCurrentProcess (). ProcessName retorna "dotnet".
Evgeni Nabokov
11
O diretório atual é temporariamente transitório e não pode ser considerado o local do assembly / executável.
jwdonahue 2/09/19
1

Isso funciona se você precisar apenas do nome do aplicativo sem extensão:

Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);
RJN
fonte
-1

Para obter o caminho e o nome

System.Diagnostics.Process.GetCurrentProcess (). MainModule.FileName

Ewerton Dutra
fonte
Isso duplica essa resposta e essa resposta .
BACON