如何获取可执行文件被调用的名称(相当于 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]直接跟踪,而不是正在运行的进程可执行文件名称。对于符号链接,它们有所不同。
在看到一切都失败后,有必要使用 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 上找到可供使用的二进制文件。
我早就该自我回答了。迟到总比不到好。直到现在似乎还没人关心。
| 归档时间: |
|
| 查看次数: |
2303 次 |
| 最近记录: |