C #에서 현재 실행 파일의 이름을 어떻게 얻습니까?


355

현재 실행중인 프로그램의 이름, 즉 프로그램의 실행 파일 이름을 얻고 싶습니다. C / C ++에서는에서 가져옵니다 args[0].


실행 파일은 EXE 파일 (Windows Forms, WPF 응용 프로그램)입니까? 프로그램은 데스크톱 응용 프로그램 (WinForms, WPF 및 WinRT-Windows Phone?), 웹 응용 프로그램, Wcf 서비스 응용 프로그램, Visual Studio Addin, Outlook-Word Addin, VS의 단위 테스트 (MSTest) 또는 Silverlight 응용 프로그램 일 수 있습니다.
Kiquenet

답변:


405
System.AppDomain.CurrentDomain.FriendlyName

61
허용되는 답변에주의하십시오. System.AppDomain.CurrentDomain.FriendlyNameClick-Once 배포 응용 프로그램에서 사용하는 데 문제가 있습니다 . 우리에게는 원래 exe 이름이 아닌 " DefaultDomain " 이 반환 됩니다.
Gaspode

40
우리는 이것을 결국 사용했습니다 :string file = object_of_type_in_application_assembly.GetType().Assembly.Location; string app = System.IO.Path.GetFileNameWithoutExtension( file );
Gaspode

4
FriendlyName은 무엇이든 설정할 수 있습니다. 또한 여러 dll이있는 exe가 있으면 어셈블리 위치를 얻는 것만으로는 충분하지 않을 수 있습니다. 또한 여러 AppDomain을 사용하는 경우 Assembly.GetCallingAssembly ()는 null을 반환합니다.
user276648 1

2
@Gaspode : Path.GetFileNameWithoutExtension (GetType (). Assembly.Location)을 말하는 것이 더 쉬울 것입니다-현재 어셈블리에서 유형의 객체를 지정할 필요가 없습니다. 이것의 GetType을 사용할 수 있으며 "this"라고 말할 필요도 없습니다.
vbullinger

4
이 방법은 유용 할 수 있지만 허용되는 답변 이되어서는 안됩니다 . 요청 된 것과 크게 다릅니다. 일부 상황에서는 우연히 동일 할 것입니다 . 그러나 이것은 완전히 다른 것입니다. 응용 프로그램을 직접 작성하지 않은 경우 "I like potato!"를 반환 할 수 있습니다. 또는 유머러스 한 동료가 응용 프로그램을 빌드 할 때이 속성에 쓴 다른 내용!
아노 자켄

237

System.AppDomain.CurrentDomain.FriendlyName -확장자가있는 파일 이름을 반환합니다 (예 : MyApp.exe).

System.Diagnostics.Process.GetCurrentProcess().ProcessName- 확장자가 없는 파일 이름 (예 : MyApp)을 반환합니다 .

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName-전체 경로와 파일 이름을 반환합니다 (예 : C : \ Examples \ Processes \ MyApp.exe). 그런 다음 이것을 전달 System.IO.Path.GetFileName()하거나 System.IO.Path.GetFileNameWithoutExtension()위와 동일한 결과를 얻을 수 있습니다.


3
AppDomain은 EXE 응용 프로그램, 웹 응용 프로그램, 단위 테스트 응용 프로그램, Addin Visual Studio 및 "Silverlight App"(?) 일 수 있습니다. 어쩌면 모든 경우에 흥미로운 완벽한 솔루션 일 것입니다. 예를 들어, 단위 테스트 VS2012의 경우-ProcessName : vstest.executionengine.x86 MainModule.FileName : C : \ PROGRAM FILES (X86) \ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName : vstest.executionengine.x86.exe FriendlyName : UnitTestAdapter : 테스트 실행 ApplicationName :
Kiquenet

"프로그램"은 데스크톱 응용 프로그램 (WinForms, WPF 및 WinRT-Windows Phone?), 웹 응용 프로그램, Wcf 서비스 응용 프로그램, Visual Studio Addin, Outlook-Word Addin, VS의 단위 테스트 (MSTest) 또는 Silverlight 응용 프로그램 일 수 있습니다. . 예를 들어, IISExpress 또는 WebDevServer가 아닌 IIS에서 호스팅되는 Wcf 서비스 응용 프로그램에 대한 서비스 호스트 어셈블리를 얻는 방법은 무엇입니까?
Kiquenet

6
+1이 답변은 깨끗하고 간단한 방법으로 필요할 수있는 세 가지 변형을 모두 제공하므로이 대답을 사용하겠습니다. 경로 나 확장자없이 베어 프로그램 이름을 사용하면 프로그램 내 도움말 텍스트 ( /?스위치) 에 매우 유용 합니다. 확장자와 경로를 사용하면 불필요하게 복잡해지기 때문입니다.
Synetech

2
의 결과를 처리하는 것을 잊지 마십시오GetCurrentProcess()
마흐무드 알 - Qudsi

Process.GetCurrentProcess().ProcessName()MyApp.vshost 를 반환합니다 .
Jonathan Wood

106

System.Diagnostics.Process.GetCurrentProcess()현재 실행중인 프로세스를 가져옵니다. ProcessName속성을 사용 하여 이름을 알아낼 수 있습니다 . 아래는 샘플 콘솔 앱입니다.

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Process.GetCurrentProcess().ProcessName);
        Console.ReadLine();
    }
}

36
더 나은 Process.GetCurrentProcess (). MainModule.FileName 사용
KindDragon

Process.GetCurrentProcess (). MainModule.FileName은 Excel Addin (ExcelDNA) 내에서 완벽하게 작동합니다.
earcam

10
이 방법은 Mono 런타임에서 사용될 때 실패합니다. Mono에서 실행되는 응용 프로그램의 프로세스 이름은 항상 .../bin/mono* nixes 또는 .../mono.exeWindows 에서 변형 됩니다.
cdhowie

1
이것이 정답입니다. 현재 AppDomain 이름은 실행 가능한 프로세스 이름과 아무 관련이 없을 수 있습니다. 특히 여러 응용 프로그램 도메인이있는 경우
Ivan Krivyakov

이 방법은 Assembly 클래스를 사용하는 것보다 상당히 느릴 수 있습니다.
Erwin Mayer

99

이것으로 충분합니다 :

Environment.GetCommandLineArgs()[0];

3
흠, 이것은 (vs.net에서 실행하고 디버그 호스팅을 사용하는 경우) filename.vshost.exe의 위치와 이름을 반환합니다. 실제로는 현재 실행중인 파일입니다.
Frederik Gheysels

13
이것은 C / C ++ Environment.GetCommandLineArgs()의 정확한 C # 아날로그 이기 때문에 가장 좋은 대답입니다 argv.
Frederick The Fool

동의했다! 가장 좋은 답변입니다. Environment.GetCommandLineArgs () [1];를 구해야합니다.
Jerry Liang

1
전체 경로를 피하려면Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0])
Nathan

1
이것은 WCF 서비스를 추적하려고 할 때 잘 작동합니다. 필자의 경우 프로세스 이름이 iisexpress와 함께 다시 나타납니다. 그러나이 명령은 실제 ​​WCF 서비스 어셈블리 이름을 제공합니다.
P.Brian.Mackey

19

이것은 나를 위해 일한 코드입니다.

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

위의 모든 예제는 vshost 또는 실행중인 dll 이름을 가진 processName을 제공했습니다.


4
모르거나 다른 답변에서 누락 된 사람들의 경우 Assembly의 네임 스페이스는 System.Reflection이고 Path의 네임 스페이스는 System.IO입니다.
amalgamate

4
응용 프로그램 진입 점이 어셈블리가 아닌 기본 코드에있는 경우 GetEntryAssembly는 null을 반환합니다.
Emdot

18

이 시도:

System.Reflection.Assembly.GetExecutingAssembly()

System.Reflection.Assembly현재 애플리케이션에 대해 알고 싶은 모든 데이터가 있는 인스턴스를 반환합니다 . 나는 그 Location속성이 당신이 구체적으로 추구 한 것을 얻을 수 있다고 생각합니다 .


6
.NET의 섀도 복사 기능이 활성화 된 경우 CodeBase대신 사용 하는 것이 더 안전 할 수 있습니다 Location. blogs.msdn.com/suzcook/archive/2003/06/26/…
Dirk Vollmar

18
GetExecutingAssembly ()에주의하십시오 : 라이브러리 어셈블리에서 이것을 호출하면 엔트리 어셈블리의 이름과 다른 라이브러리 어셈블리의 이름을 반환합니다 (예 : 원본 실행 파일). GetEntryAssembly ()를 사용하는 경우 실제 실행 파일의 이름을 반환하지만 프로세스가 WCF에서 실행되는 경우 예외가 발생합니다 (드문 경우). 가장 강력한 코드의 경우 Process.GetCurrentProcess (). ProcessName을 사용하십시오.
Contango

@Gravitas : / usr / bin / mono와 같이 "해석"을 실행하는 실행 파일은 프로세스 이름이 잘못됩니다. 또한 ProcessName은 Windows 서비스에서 작동하지 않습니다. 라이브러리에서 사용하는 경우 GetCallingAssembly를 사용하십시오.
Stefan Steiger

1
나를 위해 일했다. 반환 된 어셈블리 인스턴스 GetName () 호출의 속성 이름은 필요한 것이며 ".exe"부분은 포함하지 않습니다. 예상 된 결과로 Mono / Linux에서도 테스트되었습니다. Assembly.GetName (). Name
Hatoru Hansou

1
흠, 파일 탐색기를 사용하여 실행 파일의 이름을 직접 바꾸어도 반환 된 문자열은 변경되지 않습니다. Environment.GetCommandLineArgs () [0]은 실제 실행 파일 이름과 함께 변경됩니다 (물론). 우연히도, 두 번째 방법은 데이터 폴더의 이름이 실제 실행 파일 이름으로 지정되기 때문에 특정 상황에서 더 좋았습니다.
Hatoru Hansou

11
System.Reflection.Assembly.GetExecutingAssembly().ManifestModule.Name;

앱의 FileName을 제공합니다. "MyApplication.exe"


11

왜 아무도 이것을 간단하게 제안하지 않았습니까?

Path.GetFileName(Application.ExecutablePath)

3
Application이 상주하는 네임 스페이스
Jeetendra

6
이것은 Windows Forms 앱 내부에있을 때 유용하지만 그렇지 않은 경우
NineBerry

당신은에 관심이있을 수 @NineBerry Application.ExecutablePath소스 코드 .
Spooky

@NineBerry 내 게시물을 참조하십시오. System.Windows.Forms에 대한 참조를 추가하면 콘솔 앱 내에서 작동합니다.
John


9

방화벽 규칙을 설정하기 위해 프로그램 이름이 필요한 경우 다음을 사용하십시오.

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

이렇게하면 VisualStudio에서 디버깅 할 때와 Windows에서 직접 앱을 실행할 때 이름이 올바른지 확인할 수 있습니다.


2
내 목적을 위해 (로깅 파일 이름 만들기) 이것이 가장 좋은 대답입니다. 호스팅 된 프로세스 (예 : 서비스 또는 웹 응용 프로그램)를 실행하는 경우 System.AppDomain.CurrentDomain.FriendlyName은 슬래시가 포함 된 추악한 GUID 이름을 반환 할 수 있습니다.
Curt

8

불확실하거나 의심 스러우면 원을 향해 비명을 지르며 소리를 지르십시오.

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

각 옵션을 테스트했다고 주장 할 수는 없지만 디버깅 세션 중에 호스트를 반환하는 것과 같은 어리석은 행동은 없습니다.


2
오락 +1 :-) 환경에 대해 전혀 모르는 실제 라이브러리를 작성하지 않는 한이 코드를 거의 사용하지 않을 것입니다 (그리고 아마도 사용하려는 전역 상태를 유지하는 것은 좋지 않을 것입니다) 에 대한 이름).
Andrey Tarantsov

@Orwellophile "프로그램"은 데스크톱 응용 프로그램 (WinForms, WPF 및 WinRT-Windows Phone?), 웹 응용 프로그램, Wcf 서비스 응용 프로그램, Visual Studio Addin, Outlook-Word Addin, VS의 단위 테스트 (MSTest) 또는 Silverlight 응용 프로그램. 예를 들어, IISExpress 또는 WebDevServer가 아닌 IIS에서 호스팅되는 Wcf 서비스 응용 프로그램에 대한 서비스 호스트 어셈블리를 얻는 방법은 무엇입니까? WinForms, WPF, 웹 응용 프로그램, Wcf 서비스 응용 프로그램, Visual Studio Addin, Outlook-Word Addin, VS (MSTest) 응용 프로그램에 유효한 모든 코드?
Kiquenet

8
  • System.Reflection.Assembly.GetEntryAssembly().Location 어셈블리가 메모리에서로드되지 않은 경우 exe 이름의 위치를 ​​반환합니다.
  • System.Reflection.Assembly.GetEntryAssembly().CodeBase 위치를 URL로 반환합니다.

테스트 한 결과 C # 라이브러리 내에서 호출 된 경우에도 100 % 작동합니다.
Contango

1
기본 AppDomain에 없으면 GetEntryAssembly ()가 null을 반환합니다.
user276648

4

실행 파일의 전체 경로 정보를 찾으려면 신뢰할 수있는 방법은 다음을 사용하는 것입니다.

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

이것은 중간 dll, vshost 등과 관련된 문제를 제거합니다.


realpath와 STL C ++ 문자열 바꾸기를 사용하여 Ubuntu Linux 15.10 C ++에서 신뢰할 수있는 방법을 시도했는데 Point and Click이 실패했습니다. 오늘날 소프트웨어 관리자가 예상 한대로 모노 버그로 인한 것일 수 있습니까? 감사.
Frank

시도해
보는 것도

Gasponde는 "Click-Once 배포 응용 프로그램에서 System.AppDomain.CurrentDomain.FriendlyName을 사용하는 데 문제가있었습니다." .NET에 Click-Once가 배포 된 응용 프로그램의 문제에 대해 추측 할 수 있습니까? 감사.
Frank

VS2017의 샘플 프로그램에 대해 C : \ Program Files \ dotnet \ dotnet.exe를 반환합니다.
jwdonahue

3

Environment.GetCommandLineArgs()인수를 얻기 위해 사용할 수 있으며Environment.CommandLine 를 얻고 입력 한대로 실제 명령 행 .

또한, 당신은 Assembly.GetEntryAssembly()또는Process.GetCurrentProcess() 있습니다.

그러나 디버깅 할 때이 마지막 예제는 다른 예제와 마찬가지로 실행 파일이 아닌 디버거의 실행 파일 이름 (디버거 연결 방법에 따라 다름)을 제공 할 수 있으므로주의해야합니다.


4
GetExecutingAssembly ()주의 : 라이브러리 어셈블리에서 이것을 호출하면 항목 어셈블리의 이름과 다른 라이브러리 어셈블리의 이름을 반환합니다 (예 : 원본 실행 파일). GetEntryAssembly ()를 사용하는 경우 실제 실행 파일의 이름을 반환하지만 프로세스가 WCF에서 실행되는 경우 예외가 발생합니다 (드문 경우). 가장 강력한 코드의 경우 Process.GetCurrentProcess (). ProcessName을 사용하십시오.
Contango

@ Gravitas : 좋은 지적-와우, 내가 쓴 이후 오랜 시간이 지났습니다! : D 그에 따라 편집하겠습니다
Jeff Yates

Environment.CommandLine최소한 Mono / Linux에서는 입력 된 명령 줄이 아닌 절대 경로를 제공합니다.
기계 달팽이

@ Mechanicalsnail : Mono와 같은 소리는 문서를 따르지 않습니다. 흥미 롭군
Jeff Yates

1

이것이 당신이 원하는 것입니까?

Assembly.GetExecutingAssembly ().Location

4
GetExecutingAssembly ()주의 : 라이브러리 어셈블리에서 이것을 호출하면 항목 어셈블리의 이름과 다른 라이브러리 어셈블리의 이름을 반환합니다 (예 : 원본 실행 파일). GetEntryAssembly ()를 사용하는 경우 실제 실행 파일의 이름을 반환하지만 프로세스가 WCF에서 실행되는 경우 예외가 발생합니다 (드문 경우). 가장 강력한 코드의 경우 Process.GetCurrentProcess (). ProcessName을 사용하십시오.
Contango

대답은 질문이되어서는 안됩니다. 그게 OP가 원하는 것입니까?
jwdonahue

1

.Net Core (또는 Mono)에서 프로세스를 정의하는 바이너리가 Mono 또는 .Net Core (dotnet)의 런타임 바이너리이고 관심있는 실제 응용 프로그램이 아닌 경우 대부분의 답변이 적용되지 않습니다. 이것을 사용하십시오 :

var myName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetEntryAssembly().Location);

1
GetEntryAssembly()null을 반환 할 수 있습니다.
user2864740

1

Windows 앱 (양식 및 콘솔)의 경우 다음을 사용합니다.

VS에서 System.Windows.Forms에 대한 참조를 추가 한 후 다음을 수행하십시오.

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

실제 실행 파일을 실행하거나 VS 내에서 디버깅하는지 여부에 따라 올바르게 작동합니다.

확장명없이 응용 프로그램 이름을 반환합니다.

남자


1

매우 쉬운 방법 :

Environment.CurrentDirectory + "\\" + Process.GetCurrentProcess().ProcessName

1
.NET Core Process.GetCurrentProcess (). ProcessName의 경우 "dotnet"을 반환합니다.
Evgeni Nabokov

1
현재 디렉토리는 일시적으로 일시적이며 어셈블리 / 실행 파일의 위치가 될 수 없습니다.
jwdonahue

1

확장명이없는 응용 프로그램 이름 만 필요한 경우 작동합니다.

Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.