2014-12-09 5 views
4

이 문서는 보이지 않지만 vNext처럼 보이지만 비 정적 메서드 void Main()을 사용하면 행복하게 컴파일하고 응용 프로그램을 실행할 수 있습니다. 실제로 새 콘솔 응용 프로그램 템플릿은 정적이 아닌 Main을 제공합니다. 예를 들어 :vNext 기본 입력 방법 선택

public class Program 
{ 
    public Guid MyGuid { get; set; } = Guid.NewGuid(); 

    void Main() 
    { 
     Console.WriteLine("Hello World {0}", MyGuid); 
     Console.ReadLine(); 
    } 
} 

MyGuid 인스턴스화하고 비어 있지 않은 GUID를 여기에있다. 그래서 나는 그것이 내 프로그램 클래스의 인스턴스를 생성하고 거기에서부터 진행된다고 가정하고 있습니다. 프로젝트 속성에서

public class Program 
{ 
    void Main() 
    { 
     Console.WriteLine("main no args"); 
     Console.ReadLine(); 
    } 

    void Main(string[] args) 
    { 
     Console.WriteLine("main with args {0}", string.Join(", ",args)); 
     Console.ReadLine(); 
    } 
} 

내가 인수 arg1arg2을 준 : 나는 두 Mains이있을 때

내 질문입니다. 그러나, 내 콘솔을 실행하면 main no args이 표시됩니다. 인수가없는 Main 인수를 제거하면 예상 출력이 main with args arg1, arg2이됩니다.

이제 코드의 메서드 순서를 변경하면 인수가있는 Main이 발생합니다. 인수를 제거하면 Main 인수가 이고 여전히이라고 표시되고 main with args으로 인쇄됩니다.

Roslyn이 정확하게 Main을 선택하는 방법에 대한 설명이 필요합니다. 항상 첫 번째 것입니까? 나는 이것이 문서화되어 있다고 확신하지만 그것을 발견 할 수 없다.

내가 Program 외에 뭔가 내 클래스 이름을 변경하는 경우

편집, 내 콘솔 응용 프로그램을 실행하고, 바로 내가 적절한 엔트리 포인트가없는 말해 충돌합니다. 그래서 내 최고의 추측이다 the first Main method in the Program class

+2

"너무 광범위"가까운 투표를 잘 모르겠습니다. 이것은 매우 좁게 초점을 맞춘 질문입니다. –

답변

5

당신의 추측은 절대적으로 옳습니다. K 런타임의 관련 코드는 here입니다.

기본적으로 정적 메인 메서드가없는 경우 런타임은 하나 이상의 Main 메서드가있는 "프로그램"이라는 형식을 찾고 인스턴스를 만들고 첫 번째 메서드를 호출합니다.

그런 다음, 프로그램라는 이름의 클래스가 검색되며, 홈페이지 방법이 조회됩니다 :

이것은 또한 here에 감동한다. Main 메쏘드가 정적 인 경우, 그것은 그대로 호출되며, 그렇지 않으면 DI를 사용하여 Program의 인스턴스가 생성되고 인스턴스에서 Main이 호출됩니다. 이 시점에서 우리 프로그램이 실행됩니다.

+0

Program 클래스에 있어야합니다. 그 묘사는 내가 바라는 바로 그 것이다. 인수에 관계없이 또는 정적 인 경우 첫 번째'Main' 메소드입니다. 감사! – Jonesopolis

0

나는 여기에 vNext가 없지만 이것이 내 생각에 이것은 현재 Visual Studio와 비슷하다. 프로젝트 설정에서 시작 객체와 메소드를 선택할 수있다. 페이지. 거기 보셨어요? 그것의 최신 버전에서 많은 것들과 마찬가지로 밝혀,

음 : 그것은 vNext처럼 보이는

는 대리자 형식에 아마 표준 Action 또는 Action<TArgs>

편집을 시작 이동했습니다. NET, 그것은 대회를 기반으로합니다. 우리는 오윈과 비슷한 것들을 보았습니다.