프로그램 진입점과 관련된 오류 및 경고 해결

이 문서에서는 다음 컴파일러 오류 및 경고를 설명합니다.

  • CS0017: 프로그램 '출력 파일 이름'에 둘 이상의 진입점이 정의되어 있습니다. /main을 사용하여 컴파일하여 진입점을 포함하는 형식을 지정합니다.
  • CS0028: '함수 선언'에 진입점으로 잘못된 서명이 있습니다.
  • CS0402: 'identifier': 진입점은 제네릭이거나 제네릭 형식일 수 없습니다.
  • CS1555: Main 메서드에 지정된 'class'를 찾을 수 없습니다.
  • CS1556: Main 메서드에 지정된 'construct'는 유효한 클래스 또는 구조체여야 합니다.
  • CS1557: Main 메서드가 다른 출력 파일에 있으므로 'class'를 사용할 수 없습니다.
  • CS1558: 'class'에 적합한 정적 Main 메서드가 없습니다.
  • CS1559: Main 메서드를 가져오므로 'object'를 사용할 수 없습니다.
  • CS2017: 모듈 또는 라이브러리를 빌드하는 경우 /main을 지정할 수 없습니다.
  • CS5001: 프로그램에 진입점에 적합한 정적 'Main' 메서드가 포함되어 있지 않습니다.
  • CS7022: 프로그램의 진입점은 전역 코드이며 '{0}' 진입점을 무시합니다.
  • CS8801: 이 컨텍스트의 최상위 문에 선언된 지역 변수 또는 로컬 함수 '{0}'를 사용할 수 없습니다.
  • CS8802: 하나의 컴파일 단위만 최상위 문을 가질 수 있습니다.
  • CS8803: 최상위 문은 네임스페이스 및 형식 선언 앞에 와야 합니다.
  • CS8805: 최상위 문을 사용하는 프로그램은 실행 파일이어야 합니다.
  • CS8899: 애플리케이션 진입점은 'UnmanagedCallersOnly'로 특성을 지정할 수 없습니다.
  • CS8937: 하나 이상의 최상위 문이 비어 있지 않아야 합니다.

Main 메서드 선언

  • CS0017: 프로그램 '출력 파일 이름'에 둘 이상의 진입점이 정의되어 있습니다. /main을 사용하여 컴파일하여 진입점을 포함하는 형식을 지정합니다.
  • CS0028: '함수 선언'이 진입점으로 적합하지 않은 서명을 가지고 있습니다.
  • CS0402: 'identifier': 진입점은 제네릭이거나 제네릭 형식일 수 없습니다.
  • CS1558: 'class'에 적합한 정적 Main 메서드가 없습니다.
  • CS5001: 프로그램에 진입점에 적합한 정적 'Main' 메서드가 포함되어 있지 않습니다.
  • CS8899: 애플리케이션 진입점은 'UnmanagedCallersOnly'로 특성을 지정할 수 없습니다.

실행 파일로 컴파일되는 프로그램에는 유효한 Main 메서드가 진입점으로 포함되어야 합니다. 자세한 내용은 Main() 및 명령줄 인수를 참조하세요.

이러한 오류를 수정하려면 Main 메서드 선언이 다음 규칙을 따르는지 확인합니다.

  • 메서드를 Main로 선언하여 반환 형식을 static, void, int 또는 Task로 지정하십시오. 이는 프로그램의 진입점(Task<int>, CS1558)을 식별하기 위해 런타임에서 특정 서명을 요구하기 때문입니다. 메서드는 선택적으로 명령줄 인수에 대한 매개 변수를 string[] 수락할 수 있습니다. async 한정자를 사용할 경우 반환 형식은 Task 또는 Task<int>이어야 하며, C# 언어 버전 7.1 이상이 대상이어야 합니다.
  • 포함하는 형식에 Main 형식 인수(CS0402)가 필요한 경우 런타임에서 고유한 진입점을 확인할 수 없으므로 메서드를 제네릭 형식 밖으로 이동합니다.
  • 진입점은 UnmanagedCallersOnlyAttribute 관리 코드에서 호출할 수 있어야 하고 Main 메서드를 관리되지 않는 호출자만(UnmanagedCallersOnly)으로 제한하므로 메서드에서 특성을 제거합니다.
  • 코드에 여러 형식의 여러 Main 메서드가 포함된 경우 StartupObject 컴파일러 옵션을 사용하여 의도한 진입점(CS0017)을 포함하는 형식을 지정합니다. 이 옵션이 없으면 컴파일러에서 사용할 메서드를 Main 확인할 수 없습니다.
  • Main exe 또는 winexe인 프로젝트에 진입점(CS5001, CS1558)이 필요하기 때문에 실행 파일이 올바른 서명을 사용하여 메서드를 정의하는 지 확인합니다. 메서드 이름은 대소문자를 구분하므로 main는 적합하지 않습니다. 실행 파일이 필요하지 않은 경우 출력 형식을 라이브러리로 변경 합니다.

메모

CS0028은 현재 C# 컴파일러가 생성하지 않는 레거시 진단입니다. 최신 버전의 컴파일러는 메서드에 잘못된 서명이 있을 경우 CS1558 또는 CS5001을 대신 보고합니다.

메모

CS0017, CS0028, CS0402, CS1558 및 CS5001은 빌드 또는 다시빌드 작업 중에만 보고됩니다. IDE에서 입력하는 동안 IntelliSense 진단으로 나타나지 않습니다.

StartupObject 컴파일러 옵션

  • CS1555: Main 메서드에 지정된 'class'를 찾을 수 없습니다.
  • CS1556: Main 메서드에 지정된 'construct'는 유효한 클래스 또는 구조체여야 합니다.
  • CS1557: Main 메서드가 다른 출력 파일에 있으므로 'class'를 사용할 수 없습니다.
  • CS1559: Main 메서드를 가져오므로 'object'를 사용할 수 없습니다.
  • CS2017: 모듈 또는 라이브러리를 빌드하는 경우 /main을 지정할 수 없습니다.

StartupObject 컴파일러 옵션(이라고도 함/main)은 여러 형식이 하나를 정의할 때 프로그램의 Main 메서드를 포함하는 형식을 지정합니다. 자세한 내용은 StartupObjectMain() 및 명령줄 인수를 참조하세요.

이러한 오류를 수정하려면 StartupObject 옵션이 유효한 형식을 참조하는지 확인하십시오.

  • StartupObject에 전달한 완전하게 정규화된 클래스 이름이 현재 컴파일의 소스 코드에 정의된 형식과 일치하는지 확인합니다. 컴파일러는 지정된 형식(CS1555)에 대해 컴파일되는 원본 파일(참조된 어셈블리가 아님)만 검색합니다. 네임스페이스를 포함하여 정규화된 이름에서 오타를 확인합니다.
  • 전달한 식별자가 제네릭이 아닌 StartupObjectclass를 참조하는지 확인하십시오. 컴파일러에는 유효한 Main 메서드(CS1556)를 포함할 수 있는 구체적인 형식이 필요합니다. 인터페이스, 열거형, 대리자 및 제네릭 형식은 유효한 대상이 아닙니다.
  • 지정된 클래스를 현재 컴파일과 동일한 출력 파일로 이동합니다. 이 /main 옵션은 단일 출력 어셈블리 내의 진입점을 확인하고 다른 출력으로 컴파일된 형식을 참조할 수 없습니다(CS1557).
  • 지정된 형식이 참조된 어셈블리가 아닌 현재 프로젝트의 소스 코드에 정의되어 있는지 확인합니다. 컴파일러는 가져온 형식을 진입점(CS1559)으로 지정할 수 없습니다.
  • /main 라이브러리 또는 모듈을 빌드할 때 옵션을 제거합니다. 출력 형식exe 또는 winexe인 실행 파일 프로젝트에만 진입점(CS2017)이 있습니다. 진입점이 필요한 경우 출력 형식을 실행 파일로 변경합니다.
  • 지정한 형식이 StartupObject 유효한 Main 메서드를 선언하는지 확인합니다. 형식이 있지만 적합한 정적 Main 메서드를 포함하지 않는 경우 컴파일러는 CS1558을 생성합니다. 필요한 서명은 Main 메서드 선언 섹션을 참조하세요.

메모

CS1557 및 CS1559는 현재 C# 컴파일러에서 생성하지 않는 레거시 진단입니다. 이러한 오류를 트리거한 시나리오는 더 이상 지원되지 않거나 탐지할 가치가 없을 정도로 거의 발생하지 않습니다.

메모

CS1555 및 CS1556은 빌드 또는 다시빌드 작업 중에만 보고됩니다. IDE에서 입력하는 동안 IntelliSense 진단으로 나타나지 않습니다.

최상위 선언문

  • CS7022: 프로그램의 진입점은 전역 코드이며 '{0}' 진입점을 무시합니다.
  • CS8801: 이 컨텍스트의 최상위 문에 선언된 지역 변수 또는 로컬 함수 '{0}'를 사용할 수 없습니다.
  • CS8802: 하나의 컴파일 단위만 최상위 문을 가질 수 있습니다.
  • CS8803: 최상위 문은 네임스페이스 및 형식 선언 앞에 와야 합니다.
  • CS8805: 최상위 문을 사용하는 프로그램은 실행 파일이어야 합니다.
  • CS8937: 최소한 하나 이상의 최상위 문이 비어 있지 않아야 합니다.

최상위 문은 명시적 Main 메서드를 프로그램의 진입점으로 대체합니다. 자세한 내용은 C# 프로그래밍 가이드의 최상위 문 과 C# 언어 사양의 최상위 문 섹션을 참조하세요.

이러한 오류를 수정하려면 최상위 문을 사용하는 것이 다음 규칙을 따르는지 확인합니다.

  • 하나의 컴파일 단위(파일)만 최상위 문(CS8802)을 포함할 수 있으므로 모든 최상위 문을 단일 파일로 통합합니다. 다른 파일의 최상위 코드를 해당 단일 파일로 이동합니다. 나머지 파일은 네임스페이스 및 형식 선언만 포함되도록 재구성합니다.
  • 컴파일러가 최상위 문을 먼저 표시해야 하기 때문에 파일의 선언 앞에 모든 최상위 문을 namespacetype 배치합니다(CS8803). using 지시문이 있다면, 그러한 지시문은 여전히 최상위의 문장 앞에 있을 수 있습니다.
  • 파일이 빈 문, 공백, 또는 주석만으로 구성되어 있을 경우에는 유효한 진입점(CS8937)으로 인정되지 않으므로, 반드시 하나 이상의 실행 가능한 코드가 포함되어야 합니다. 메서드 호출, 변수 할당 또는 식과 같은 문을 추가하여 요구 사항을 충족합니다.
  • 최상위 문 컨텍스트 자체 내에서만 최상위 문에 선언된 로컬 변수 및 로컬 함수에 액세스합니다. 이러한 선언은 생성된 진입점 메서드로 범위가 지정되고 다른 파일이나 동일한 파일(CS8801)에 선언된 형식 멤버에 표시되지 않기 때문입니다. 파일 간에 상태를 공유해야 하는 경우 변수를 형식의 정적 필드 또는 속성으로 선언합니다.
  • 최상위 문은 진입점을 정의하고 진입점은 실행 파일 프로젝트(CS8805)에서만 유효하기 때문에 프로젝트의 OutputTypeexe로 설정합니다. 라이브러리를 빌드하는 경우 최상위 문을 제거하고 대신 형식과 메서드를 사용합니다.
  • 컴파일러가 최상위 문을 진입점으로 처리하고 모든 Main 메서드를 무시하여 경고(Main)를 생성하기 때문에 최상위 문이 있을 때 명시적 메서드를 제거하거나 이름을 바꿉니다. 명시적 Main 메서드를 사용하려는 경우 최상위 문 코드를 해당 메서드로 이동하고 최상위 문을 제거합니다.