.NET 5 Linux环境下如何获取单文件可执行程序的原始程序集位置
可行解决方案
你要获取单文件发布场景下原始可执行程序的路径,用跨平台通用的实现即可,无需区分操作系统,也不依赖工作目录:
代码实现
using System.Diagnostics; using System.Reflection; public static class PathHelper { /// <summary> /// 获取原始可执行程序的绝对路径,兼容单文件/非单文件、.NET 5+所有场景 /// </summary> public static string GetOriginalExecutablePath() { // 判断是否为单文件发布运行场景 var isSingleFile = AppContext.GetData("APP_CONTEXT_PUBLISH_SINGLE_FILE") as bool? == true; if (isSingleFile) { // .NET 6+ 优先使用原生跨平台API,性能最优 if (Environment.Version.Major >= 6) { return Environment.ProcessPath; } // .NET 5 兼容方案 using var currentProcess = Process.GetCurrentProcess(); return currentProcess.MainModule.FileName; } // 非单文件场景直接返回入口程序集路径 return Assembly.GetEntryAssembly().Location; } /// <summary> /// 获取原始可执行程序所在的目录 /// </summary> public static string GetOriginalExecutableDirectory() { return Path.GetDirectoryName(GetOriginalExecutablePath()); } }
效果说明
上述代码在你的场景中会直接返回你存放单文件可执行程序的原始路径,不会返回/root/.net/下的临时解压路径。
原有API失效原因
单文件发布是.NET Core 3.0+引入的部署特性,运行时启动时会将所有绑定的程序集、依赖项解压到系统临时目录(Linux默认路径为~/.net/应用名/随机字符串目录),运行时实际加载的是解压后的dll文件。
你测试的Assembly.Location、AppContext.BaseDirectory等API都是读取当前加载的程序集的实际存储路径,所以返回的是临时目录路径,属于设计行为,并非.NET 5的缺陷。
注意事项
- 该实现完全跨Windows、Linux、macOS平台,无需额外配置,也不依赖当前工作目录
- 升级到.NET 6及以上版本后,直接使用
Environment.ProcessPath即可覆盖所有单文件场景,无需额外兼容逻辑
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

