You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

控制台程序设为开机启动时指向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:16:05