C#에서 현재 실행 중인 프로그램(실행 파일)의 이름을 가져오는 방법은 여러 가지가 있습니다. 대표적으로 System.AppDomain과 System.Diagnostics.Process를 활용하는 방식이 있으며, 어떤 API를 사용하느냐에 따라 반환되는 결과의 형태가 달라집니다. 각 방법의 특징과 예제 코드를 자세히 살펴보겠습니다.
1. System.AppDomain 사용
애플리케이션 도메인(Application Domain)은 서로 다른 앱 도메인에서 실행되는 코드 사이에 격리를 제공합니다. AppDomain은 프로세스처럼 코드와 데이터를 담는 논리적인 컨테이너 역할을 하며, 독립된 메모리 공간과 리소스 접근 권한을 가집니다. 또한 프로세스와 마찬가지로 경계(boundary) 역할을 수행하여, 한 애플리케이션에서 실행 중인 객체의 데이터를 다른 애플리케이션이 실수로 또는 불법적으로 접근하는 것을 차단합니다.
System.AppDomain 클래스는 새로운 애플리케이션 도메인을 생성하거나, 메모리에서 도메인을 언로드하는 등 애플리케이션 도메인을 제어할 수 있는 다양한 메서드를 제공합니다.
특징: 이 방법은 확장자를 포함한 파일 이름을 반환합니다. (예: Application.exe)
예제 코드
using System;
namespace DemoApplication
{
public class Program
{
public static void Main()
{
string currentExecutable =
System.AppDomain.CurrentDomain.FriendlyName;
Console.WriteLine($"Current Executable Name: {currentExecutable}");
Console.ReadLine();
}
}
}
출력 결과
Current Executable Name: MyConsoleApp.exe
2. System.Diagnostics.Process 사용
프로세스(Process)는 운영체제의 핵심 개념으로, Windows OS가 제공하는 가장 작은 격리 단위입니다. 애플리케이션을 실행하면 Windows는 고유한 프로세스 ID와 여러 속성을 지닌 프로세스를 생성하고, 필요한 메모리와 리소스를 할당합니다.
모든 Windows 프로세스에는 최소 하나 이상의 스레드가 존재하며, 이 스레드가 애플리케이션의 실행을 담당합니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있어 실행 속도 향상과 높은 응답성이라는 장점을 얻을 수 있지만, 일반적으로 단일 주 스레드로 구동되는 프로세스가 스레드 안전성(thread-safety) 측면에서 더 안전하다고 평가됩니다.
예제 1: ProcessName 사용 (확장자 제외)
특징: 이 방법은 확장자를 제외한 파일 이름을 반환합니다. (예: Application)
using System;
namespace DemoApplication
{
public class Program
{
public static void Main()
{
string currentExecutable =
System.Diagnostics.Process.GetCurrentProcess().ProcessName;
Console.WriteLine($"Current Executable Name: {currentExecutable}");
Console.ReadLine();
}
}
}
출력 결과
Current Executable Name: MyConsoleApp
예제 2: MainModule.FileName 사용 (전체 경로 포함)
특징: 이 방법은 폴더 경로까지 포함된 전체 파일 경로를 반환합니다.
using System;
namespace DemoApplication
{
public class Program
{
public static void Main()
{
string currentExecutable =
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
Console.WriteLine($"Current Executable Name: {currentExecutable}");
Console.ReadLine();
}
}
}
출력 결과
Current Executable Name:
C:\Users\UserName\source\repos\MyConsoleApp\MyConsoleApp\bin\Debug\MyConsoleApp.exe
위 예제에서 확인할 수 있듯이 Process.GetCurrentProcess().MainModule.FileName은 실행 파일의 이름뿐 아니라 파일이 위치한 디렉터리 경로까지 함께 반환합니다.
3가지 방법 비교 정리
상황에 맞는 방법을 선택하기 위해 각 API의 반환 값을 비교해 보겠습니다.
- AppDomain.CurrentDomain.FriendlyName: 파일명 + 확장자 (예: MyConsoleApp.exe)
- Process.GetCurrentProcess().ProcessName: 파일명만 (예: MyConsoleApp)
- Process.GetCurrentProcess().MainModule.FileName: 전체 경로 + 파일명 (예: C:\...\MyConsoleApp.exe)
단순히 실행 파일의 이름만 필요하다면 AppDomain 또는 ProcessName을, 로깅이나 파일 시스템 작업을 위해 전체 경로가 필요하다면 MainModule.FileName을 사용하는 것이 좋습니다.