使用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]以使其完全透明。
答案 0 :(得分:3)
Environment.CommandLine
和Environment.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