我们如何在C#中获得argv [0]?

时间:2019-05-01 03:21:20

标签: c# linux argv

使用C / C ++,我们可以获得argv [0]:

printf("%s\n",argv[0])

在C#中,args以argv [1]开头。

至少在Linux下,没有波纹管API给出了argv [0]:

AppDomain.CurrentDomain.FriendlyName: only gives the name, no path
Process.GetCurrentProcess().ProcessName: gives wrong result with symbol link, and no path
Process.GetCurrentProcess().MainModule.FileName:  gives wrong result with symbol link, and the path is always absolute

FYI:在具有上述C / C ++代码的Linux下(其结果在此处被视为黄金标准),它将打印用于调用程序的精确路径(绝对或相对),如果您调用该程序通过任何符号链接,将打印符号链接的名称,而不是实际程序。

之所以问这个问题,是因为我尝试在Ubuntu下使用C#编写包装程序,如果包装程序的行为取决于argv [0],则应该传递argv [0]以使其完全透明。

2 个答案:

答案 0 :(得分:3)

Environment.CommandLineEnvironment.GetCommandLineArgs()应该包含完整且未修改的命令行。

答案 1 :(得分:0)

接受的答案在 Linux 上的 .NET 5 上对我不起作用,我得到 $PROJECT_DIRECTORY/bin/Debug/net5.0/$PROJECT_NAME.dll。此外,如果使用符号链接,这不会改变。

相反,我必须使用这个不可移植的 hack(取自 this 评论):

(await File.ReadAllTextAsync("/proc/self/cmdline")).Split('\0')[0]

结果:

$ bin/Debug/net5.0/bpm
argv[0]: bin/Debug/net5.0/bpm
$ ln -s bin/Debug/net5.0/bpm foo
$ ./foo
argv[0]: ./foo