如何在C#中获取服务调用的可执行文件所在文件夹路径?
获取Windows服务可执行文件所在文件夹路径的C#方法
在Windows服务场景下,程序默认工作目录会指向System32,导致相对路径查找文件失败。以下两种方法可以准确获取服务可执行文件的所在文件夹:
方法1:通过入口程序集获取
利用Assembly.GetEntryAssembly()获取服务的入口程序集(即你的exe文件),再提取其所在目录:
using System.IO; using System.Reflection; // 获取入口程序集的路径 var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly == null) { // 服务场景下一般不会触发此异常,可根据需求添加处理逻辑 throw new InvalidOperationException("无法获取入口程序集"); } string exeFullPath = entryAssembly.Location; string serviceFolder = Path.GetDirectoryName(exeFullPath); // serviceFolder即为可执行文件所在的文件夹路径
这种方法直接关联服务的入口程序,不受工作目录影响,是服务场景下最可靠的方式之一。
方法2:通过当前进程主模块获取
通过Process.GetCurrentProcess()获取当前服务进程的主模块,进而拿到exe的实际路径:
using System.IO; using System.Diagnostics; // 获取当前进程的主模块路径 var currentProcess = Process.GetCurrentProcess(); string exeFullPath = currentProcess.MainModule.FileName; string serviceFolder = Path.GetDirectoryName(exeFullPath);
该方法通过进程信息获取路径,同样能避开System32的工作目录干扰,适用于所有进程场景。
注意事项
- 确保添加对应的命名空间引用(
System.Reflection/System.Diagnostics/System.IO); - 两种方法在服务运行时均能返回正确的exe所在目录,不会被工作目录误导;
- 拿到路径后,可将其与配置文件名拼接成完整路径,传递给需要的库即可解决文件查找问题。
内容的提问来源于stack exchange,提问作者user19335768
相关产品推荐
相关产品推荐

