vNext选择输入的主要方法

Jon*_*lis 4 c# c#-6.0 visual-studio-2015

我没有看到任何相关的文档,但它看起来像在vNext中,您可以愉快地使用非静态方法编译和运行应用程序void Main().实际上,新的控制台应用程序模板为您提供了非静态主菜单.例如:

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

    void Main()
    {
        Console.WriteLine("Hello World {0}", MyGuid);
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

MyGuid是实例化的,这里是一个非空的Guid.所以我假设它创建了一个我的Program类的实例并从那里开始.

我的问题是我有两个Mains:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目属性中,我给出了参数arg1arg2.但是,main no args当我运行它时,我的控制台会显示.如果我删除无参数Main,我得到预期的输出main with args arg1, arg2.

现在,如果我在代码中切换方法的顺序,我Main的参数就会被命中.如果我删除参数,我Main的参数仍然会被打印,打印main with args.

我想澄清罗斯林如何Main精确地选择我的.它总是第一个吗?我确信这是有记录的,但我找不到它.

编辑

如果我将我的类名更改为其他内容Program,我的控制台应用程序会运行,并立即崩溃,告诉我我没有合适的入口点.所以我最好的猜测是the first Main method in the Program class

Ant*_*t P 5

你的猜测绝对正确.K Runtime的相关代码就在这里.

实质上,如果您没有静态main方法,运行时将使用一个或多个Main方法查找名为"Program"的类型,实例化它并调用第一个方法.

这也在这里提到:

然后,搜索名为Program的类,并查找Main方法.如果Main方法是静态的,则按原样调用,否则使用DI创建Program的实例,并在实例上调用Main.此时我们的程序正在运行.