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

How can we get argv[0] in C#?

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

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

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

非波纹管 API 给出准确的 argv[0],至少在 Linux:

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

仅供参考:在 Linux 下使用上面的 C/C++ 代码(其结果在这里被视为黄金标准),它打印用于的确切路径(绝对或相对)调用程序,如果通过任何符号 link 调用程序,将打印符号 link 的名称而不是实际程序。

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

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

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

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

(await File.ReadAllTextAsync("/proc/self/cmdline")).Split('[=10=]')[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