다음을 통해 공유


Main()과 명령줄 인수

소프트웨어 개발이 새로운가요? 먼저 시작하기 자습서부터 시작하세요. 이러한 자습서에서는 새 앱에 대해 더 간단한 최상위 문을 사용합니다.

기존 코드베이스를 사용하시겠습니까? 대부분의 기존 애플리케이션은 명시적 Main 메서드를 사용합니다. 이 문서에서는 작동 방식과 효과적으로 사용하는 방법을 설명합니다.

C# 애플리케이션을 시작하면 런타임에서 메서드를 호출합니다 Main . Main 메서드는 C# 애플리케이션의 진입점입니다.

C# 프로그램에는 진입점이 하나만 있을 수 있습니다. 메서드를 Main 사용하는 클래스가 두 개 이상 있는 경우 프로그램을 컴파일할 때 StartupObject 컴파일러 옵션을 사용하여 진입점 역할을 하는 메서드를 Main 지정해야 합니다. 자세한 내용은 StartupObject(C# 컴파일러 옵션)를 참조하세요. 다음 예제에서는 명령줄 인수 수를 첫 번째 작업으로 표시합니다.

class TestClass
{
    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);
    }
}

개요

Main 메서드는 실행 프로그램의 진입점입니다. 프로그램이 시작되면 다른 코드가 실행되기 전에 런타임이 호출 Main 됩니다. 반환되면 Main 프로그램이 종료됩니다. Main 다음 규칙을 사용하여 선언합니다.

  • 클래스 또는 구조체 내에서 선언 Main 해야 합니다. 바깥쪽 classstatic일 수 있습니다.
  • Mainstatic이어야 합니다.
  • Main액세스 한정자를 가질 수 있습니다.
  • Main를 반환할 voidintTask수 있습니다.Task<int>
  • MainTask 또는 Task<int>를 반환할 때에만 Main 선언에는 async 한정자를 포함할 수 있습니다. 이 규칙은 특히 메서드를 async void Main 제외합니다.
  • 명령줄 인수를 Main 포함하는 매개 변수를 사용하거나 사용하지 않고 string[] 메서드를 선언할 수 있습니다. Visual Studio를 사용하여 Windows 애플리케이션을 만들 때 매개 변수를 수동으로 추가하거나 메서드를 GetCommandLineArgs() 사용하여 명령줄 인수를 가져올 수 있습니다. 매개 변수는 인덱싱되지 않은 명령줄 인수입니다. C 및 C++와 달리 프로그램의 이름은 배열의 첫 번째 명령줄 인수 args 로 처리되지 않지만 메서드의 GetCommandLineArgs() 첫 번째 요소입니다.

다음 목록은 Main 선언의 순열을 보여줍니다.

static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }

앞의 예제에서는 액세스 한정자를 지정하지 않으므로 기본적으로 암시적으로 private입니다. 명시적 액세스 한정자를 지정할 수 있습니다.

다음 표에는 유효한 Main 모든 서명과 각 서명을 사용해야 하는 시기가 요약되어 있습니다.

Main 선언 사용함 args 포함 await 종료 코드를 반환합니다.
static void Main() No No No
static int Main() No No
static void Main(string[] args) No No
static int Main(string[] args) No
static async Task Main() No No
static async Task<int> Main() No
static async Task Main(string[] args) No
static async Task<int> Main(string[] args)

요구에 맞는 가장 간단한 서명을 선택합니다. 명령줄 인수가 필요하지 않은 경우 매개 변수를 생략합니다 string[] args . 종료 코드를 반환할 필요가 없는 경우 사용 void 하거나 Task. 비동기 메서드를 호출해야 하는 경우 async을(를) Task 또는 Task<int> 반환 형식으로 사용하십시오.

Main() 반환 값

반환 int 하거나 Task<int>프로그램이 실행 파일을 실행하는 다른 프로그램 또는 스크립트로 상태 정보를 보낼 수 있습니다. 반환 값은 0 일반적으로 성공을 의미하며 0이 아닌 값은 오류가 있음을 의미합니다.

다음 예제에서는 종료 코드를 반환합니다.

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

프로그램을 실행한 후 종료 코드를 확인할 수 있습니다. PowerShell에서 .를 사용합니다 $LastExitCode. 일괄 처리 파일 또는 셸 스크립트에서 %ERRORLEVEL%를 사용하십시오.

Main 메서드가 await을(를) 사용하는 경우, async로 선언하고 TaskTask<int> 반환 형식으로 선언하십시오. 런타임은 Main를 호출하고 프로세스가 종료되기 전에 반환된 Task가 완료되기를 기다립니다. 반환 형식은 `void` 또는 `int`일 수 없습니다. 이는 `async` 한정자가 런타임에서 대기할 수 있는 반환 형식을 필요로 하기 때문입니다. `void`와 `int`는 진행 중인 작업을 나타내지 않으므로 비동기 작업이 완료되기 전에 프로세스가 종료될 수 있습니다. 종료 코드 Task 가 필요하지 않거나 다음을 수행할 때 사용합니다Task<int>.

class Program
{
    static async Task<int> Main(string[] args)
    {
        return await AsyncConsoleWork();
    }

    private static async Task<int> AsyncConsoleWork()
    {
        return 0;
    }
}

명령줄 인수

명령줄 인수를 string[] argsMain 수락하는 매개 변수를 선언에 포함합니다. 필요하지 않은 경우 매개 변수를 생략합니다. 매개 변수 args는 null이 아닌 String 배열입니다. 인수가 제공되지 않으면 Length가 0입니다.

문자열 인수를 Parse 또는 Convert를 사용하여 다른 형식으로 변환할 수 있습니다.

long num = long.Parse(args[0]);

명령줄 인수 구문 분석은 복잡할 수 있습니다. System.CommandLine 라이브러리를 사용하여 프로세스를 간소화하는 것이 좋습니다.

작업 예제는 명령줄 인수를 표시하는 방법을 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.