如何获取适配独立EXE与dotnet命令启动的当前程序路径?
适配单文件EXE与dotnet命令启动的程序路径获取方法
可以通过结合Assembly.GetEntryAssembly()和Environment.ProcessPath实现跨场景的路径获取,核心思路是根据运行场景自动切换获取逻辑:
实现代码
using System; using System.Reflection; public static class ApplicationPathHelper { public static string GetApplicationFilePath() { var entryAssembly = Assembly.GetEntryAssembly(); // 非单文件发布场景(含dotnet xxx.dll启动、普通独立EXE) if (entryAssembly != null && !string.IsNullOrEmpty(entryAssembly.Location)) { return entryAssembly.Location; } // 单文件发布EXE场景 var processPath = Environment.ProcessPath; if (!string.IsNullOrEmpty(processPath)) { return processPath; } // 极端异常场景,可根据业务需求调整处理逻辑 throw new InvalidOperationException("无法获取当前应用程序的文件路径"); } }
逻辑说明
- 非单文件场景:当通过
dotnet <program.dll>启动,或普通编译的独立EXE运行时,Assembly.GetEntryAssembly().Location会直接返回程序集(dll/exe)的实际磁盘路径,这是最准确的程序本身路径。 - 单文件EXE场景:单文件发布的应用在运行时,
Assembly.GetEntryAssembly().Location会返回空字符串(因为程序集被嵌入到单文件EXE中,运行时无独立磁盘文件),此时用Environment.ProcessPath获取当前运行的EXE路径,这是.NET 6+官方推荐的单文件路径获取方式。 - 边界处理:加入
null判断避免空引用异常,极端场景下可选择抛出异常或返回默认值,按需调整即可。
场景验证
- 单文件EXE:执行
dotnet publish -r win-x64 -p:PublishSingleFile=true发布后,运行生成的EXE,方法返回该EXE的完整路径。 - dotnet命令启动:执行
dotnet MyApp.dll,方法返回MyApp.dll的完整路径。 - 普通独立EXE:常规发布的EXE运行时,两种方式都能获取正确路径,此处优先返回程序集路径,结果与
Environment.ProcessPath一致。
内容的提问来源于stack exchange,提问作者Iain Brown
相关产品推荐
相关产品推荐

