【问题标题】:How can we get argv[0] in C#?我们如何在 C# 中获取 argv[0]?
【发布时间】:2019-09-19 17:21:06
【问题描述】:

使用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

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

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

【问题讨论】:

  • C# is base 0.printf("%s\n",argv[0])时的错误信息是什么?
  • @Jeremy Thompson ?听不懂你说什么。
  • 如果你想要Assembly的路径可以试试:var dir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location.Replace("bin\\Debug", string.Empty));
  • Assembly.GetExecutingAssembly().Location 将为您提供程序集的完整路径。在.Net Core 中,这将是DLL,对于.Net Framework 控制台应用程序,这将是.exe
  • 请阅读问题,我不想获得许多 API 可以提供的程序集。我需要在 C/C++ 程序中准确地获取 argv[0]。这通常与程序集名称不同。应该有一个 Program 的属性来提供这个。

标签: c# linux argv


【解决方案1】:

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

【讨论】:

  • 哈,这就是他/她想要的。
  • 在 Ubuntu 上测试,适用于大多数情况,但仍然不适用于相对命令行,它被转移到绝对命令行,也许这被认为是运行时的限制/错误?跨度>
  • 解决这个问题的方法(如果真的没有解决方案)是将 C# 包装器包装在另一个用支持精确 argv[0] 的语言编写的包装器中,例如 C/C++(或 bash?)它将 argv[0] 传递为 argv[1] 等等,而 C# 程序将 argv[1] 视为 argv[0] 等等。
  • 嗯,它在 .NET Framework 上按预期工作,但在 .NET Core 上却不行。我猜想隐藏 dotnet/self-contained 启动器可执行文件会被破坏。如果可能,您可能必须参考平台原生 API 来获取原始命令行。
  • @kalimag 你知道如何使用 ProcessStartInfo 将精确的 argv[0] 传递给启动的进程吗?我不想为此再问另一个问题。
【解决方案2】:

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

相反,我必须使用这个非便携式黑客(取自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

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 2011-01-02
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2011-05-01
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多