如何获取 C# 中当前可执行文件的名称?(.NET 5 版本)

Jos*_*hua 7 c# .net-core

如何获取可执行文件被调用的名称(相当于 C 的 argv[0])?我实际上需要处理某人重命名可执行文件之类的事情。

有一个著名的问题,但有很多答案都不起作用。尝试过的答案:

System.AppDomain.CurrentDomain.FriendlyName
Run Code Online (Sandbox Code Playgroud)

返回编译时的名称

System.Diagnostics.Process.GetCurrentProcess().ProcessName
Run Code Online (Sandbox Code Playgroud)

剥离扩展名(曾经将 .exe 重命名为 .com 吗?),还可以通过符号链接查看

Environment.GetCommandLineArgs()[0]
Run Code Online (Sandbox Code Playgroud)

它返回一个以 结尾的名称.dll,显然是一个错误。

Assembly.GetEntryAssembly().Location
Run Code Online (Sandbox Code Playgroud)

返回空值

System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
Run Code Online (Sandbox Code Playgroud)

再次返回一个.dll名字。

.net 5.0 的文档说Environment.GetCommandLineArguments()[0]可以工作;但它实际上不起作用。它以某种方式查看符号链接并返回真实的可执行文件名称。

我想做的是将我们所有的东西链接到一个多调用二进制文件中,这样我就可以在生成的二进制文件上使用 .net 5 框架缩减程序,这样我就不必运送大约 30MB 的 .net 5 框架没有使用。我真的不想做一个平台梯子和 P/Invoke 一堆东西,除非我必须这样做。

我argv[0]直接跟踪,而不是正在运行的进程可执行文件名称。对于符号链接,它们有所不同。

Jos*_*hua 1

在看到一切都失败后,有必要使用 P/Invoke 来使这项工作正常进行。虽然Process.GetCurrentProcess().MainModule?.FileName可靠地返回可执行二进制文件(至少当不在调试器下运行时),但这不提供启动二进制文件所用的命令调用。

在 Windows 上,GetCommandLine()是 P/Invokable,只需要一些解析即可获取信息。在 *n?x 上,读取/proc/self/cmdline执行相同的工作。

我建立了一个封装它的库。https://github.com/joshudson/Emet/tree/master/MultiCall您可以在 nuget.org 上找到可供使用的二进制文件。

我早就该自我回答了。迟到总比不到好。直到现在似乎还没人关心。