控制台程序设为开机启动时指向DLL而非EXE,如何解决?
解决控制台应用开机启动项指向DLL而非EXE的问题
问题根源
你遇到的情况是因为:
- 若使用.NET Core/.NET 5+控制台应用,
Assembly.GetExecutingAssembly().Location返回的是当前代码所在程序集(可能是类库DLL)的路径,而非主EXE。 Application.ExecutablePath是WinForms/WPF专属API,控制台应用中调用它无法正确获取主进程的EXE路径,甚至可能抛出异常。
可行解决方案
方案1:使用Environment.ProcessPath(推荐,.NET 5+)
这是.NET 5及以上版本提供的原生API,直接返回当前运行进程的可执行文件路径,完全适配控制台应用:
using Microsoft.Win32; using System; var runKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); runKey?.SetValue("MyApp", Environment.ProcessPath);
方案2:使用进程主模块路径(兼容全.NET版本)
如果需要兼容.NET Framework或更早的.NET Core版本,可通过当前进程的主模块获取EXE路径:
using Microsoft.Win32; using System.Diagnostics; var runKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); string exePath = Process.GetCurrentProcess().MainModule.FileName; runKey?.SetValue("MyApp", exePath);
注意:此方法需要引用
System.Diagnostics.Process,部分受限环境下可能需要管理员权限。
方案3:手动转换DLL路径(仅适用于固定目录结构)
如果确认主EXE与当前DLL在同一目录下,可通过替换文件后缀的方式获取EXE路径:
using Microsoft.Win32; using System.IO; using System.Reflection; string dllPath = Assembly.GetExecutingAssembly().Location; string exePath = Path.ChangeExtension(dllPath, ".exe"); var runKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true); runKey?.SetValue("MyApp", exePath);
此方法依赖固定的文件结构,若发布方式变更(如单文件发布)可能失效。
额外提示
- 注册表路径中的反斜杠必须用
@转义,否则会被解析为转义字符导致路径错误。 - 若使用单文件发布,优先选择方案1,避免路径解析异常。
内容的提问来源于stack exchange,提问作者Rifat
相关产品推荐
相关产品推荐

