繁体   English   中英

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

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

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

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

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

Non of bellow 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++ 代码(其结果在这里被视为黄金标准),它打印用于调用程序的确切路径(绝对或相对),如果您通过任何符号调用程序链接,符号链接的名称被打印而不是真正的程序。

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

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

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

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

(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM