控制台应用程序参数,参数如何传递到Main方法

65
这是一个来自C#初学者的问题。 当我创建控制台应用程序时,会得到一个带有参数args的Main方法,并且这些参数是字符串数组。 我不理解系统是如何调用该方法并将args传递给Main方法的。也许有人可以解释一下?Main方法是否被某种控制台类重写了?
namespace ConsoleApplication1
{
    class Program
    {    
        static void Main(string[] args)
        {    
        }
    }
}

这篇有用的文章的前半部分仅涉及将参数传递给简单的控制台应用程序。 - stanimirsp
10个回答

123

所有的回答都很棒,而且解释得非常好。

但是我想指出一种不同的传递参数到主方法的方式。

在Visual Studio中

  1. 右键单击项目,然后选择属性
  2. 转到调试选项卡,然后在启动选项部分为应用程序提供参数

就像这张图片

Properties window

祝你知道这个秘密后开心


像我这样的C#新手,这是非常好的建议!谢谢,真的帮了我很多。 - SkinnyPete63

35

主方法是您的应用程序的入口点。如果您通过 ildasm 进行检查,则

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint

这是调用方法的帮助

参数被传递为 C:\AppName arg1 arg2 arg3


33

运行时会将在控制台输入的参数按空格进行分割。

如果你调用:

myApp.exe arg1 arg2 arg3
主方法接收一个数组。
var args = new string[] {"arg1","arg2","arg3"}

13
当使用控制台应用程序模板时,代码将被编译,要求启动对象中有一个名为Main的方法作为应用程序的入口点。默认情况下,在项目属性设置中未指定启动对象,因此默认情况下将使用Program类。如果需要,您可以在“生成”选项卡下更改此设置。
请记住,无论指定哪个对象作为启动对象,该对象都必须具有名为Main的方法。
args参数以MyConsoleApp.exe value01 value02等格式传递给main方法。应用程序将每个空格后的值分配给参数数组的单独元素。因此,MyConsoleApp.exe value01 value02表示args参数具有2个元素:
[0] = "value01"

[1] = "value02"

如何解析输入值并使用它们取决于您。

希望这有所帮助。

额外阅读:

创建控制台应用程序(Visual C#)

命令行参数(C# 编程指南)


8
在 Visual Studio 中,您也可以这样做来简单地传递参数或避免使用命令行参数。
 static void Main(string[] args)
    {
        if (args == null)
        {
            Console.WriteLine("args is null"); // Check for null array
        }
        else
        {
            args=new string[2];
            args[0] = "welcome in";
            args[1] = "www.overflow.com";
            Console.Write("args length is ");
            Console.WriteLine(args.Length); // Write array length
            for (int i = 0; i < args.Length; i++) // Loop through array
            {
                string argument = args[i];
                Console.Write("args index ");
                Console.Write(i); // Write index
                Console.Write(" is [");
                Console.Write(argument); // Write string
                Console.WriteLine("]");
            }
        }

2

阅读 MSDN

简短回答: 不,主函数并没有被覆盖。当Visual Studio(实际上是编译器)构建你的exe文件时,必须声明一个汇编的起始点,这个起始点就是主函数。

如果你想要传递参数,你可以通过命令行运行你的应用程序,例如:appname.exe param1 param2,或者在项目设置中输入它们(在Debug选项卡的“Command line arguments”中)。

在主函数中,你需要读取这些参数,例如:

for (int i = 0; i < args.Length; i++)
{
    string flag = args.GetValue(i).ToString();
    if (flag == "bla") 
    {
        Bla();
    }
}

1

命令行参数是一种传递参数的方式。值得一提的是,这个MSDN示例非常值得一看。

关于命令行参数,MSDN页面也值得阅读。

在Visual Studio中,您可以通过选择控制台应用程序的属性,然后选择调试选项卡来设置命令行参数。


那就是我正在寻找的答案,如何在VS中调试传递参数给Main方法。 - RobertoFRey

1
每个托管的exe都有一个入口点,当您将代码加载到ILDASM时可以看到。入口点在CLR头中指定,可能看起来像这样。

enter image description here


0

你也可以通过创建函数,在该函数中调用主方法并将参数传递给主方法来传递参数。

static int Main(string[] args)
    {


        foreach (string b in args)
            Console.WriteLine(b+"   ");

        Console.ReadKey();
        aa();
        return 0;

    }
    public static void aa()
    {
        string []aaa={"Adil"};

        Console.WriteLine(Main(aaa));
    }

0
运行时引擎的主方法看起来像这样:int main(int argc, char *argv[]),其中argc是参数数量的计数,argv是指向每个参数的指针数组。运行时引擎将其转换为更符合C#语言的形式。
在调用该主方法之前,一切都是汇编语言。它可以访问命令行参数(因为操作系统使其对每个启动的进程可用),但是该汇编语言需要将完整命令行的单个字符串转换为多个子字符串(使用空格进行分隔)才能准备将它们传递到main()中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接