VB.Net单文件发布后Application.StartupPath返回临时目录问题咨询
单文件发布后获取应用实际启动目录的解决方案
.NET 5+ 发布为压缩单文件时,运行时会默认将所有依赖解压到
%TEMP%下的随机子目录后执行,因此Application.StartupPath、Application.ExecutablePath返回的都是临时解压目录路径,而非原始exe所在的目录。
方案1:通过进程主模块路径获取(全.NET版本兼容)
直接读取当前进程的主模块路径,即为用户启动的原始exe的完整路径,提取父目录即可得到所需的启动文件夹路径:
using System.Diagnostics; using System.IO; // 获取原始exe的完整路径 string exeFullPath = Process.GetCurrentProcess().MainModule.FileName; // 提取exe所在的文件夹路径 string actualStartupFolder = Path.GetDirectoryName(exeFullPath);
方案2:.NET 6及以上版本简化写法
.NET 6 新增了Environment.ProcessPath属性,无需额外引入命名空间即可直接获取进程主模块路径:
using System.IO; string exeFullPath = Environment.ProcessPath; string actualStartupFolder = Path.GetDirectoryName(exeFullPath);
方案3:修改发布配置,禁用临时解压逻辑
如果需要让原生的Application.StartupPath属性返回正确路径,可以在项目的.csproj文件中加入如下配置,关闭运行时解压到临时目录的逻辑:
<PropertyGroup> <PublishSingleFile>true</PublishSingleFile> <SelfContained>true</SelfContained> <!-- 禁止运行时将单文件内容全量解压到临时目录 --> <ExtractAllOnRun>false</ExtractAllOnRun> </PropertyGroup>
注意:该方案存在兼容限制,若项目引用了第三方非托管动态库,可能出现运行时加载失败的问题,优先推荐使用前两种无需修改发布配置的方案。
内容的提问来源于stack exchange,提问作者Jeremy Child
相关产品推荐
相关产品推荐

