获取应用路径时触发System.ComponentModel.Win32Exception异常如何解决
异常产生原因
- 最核心的常见原因:库项目中
Utilities\app.exe的文件属性未设置复制到输出目录,编译后该文件没有被同步输出到主程序的运行目录,导致你拼接的路径下不存在目标文件。 - 路径拼接不严谨:直接使用字符串拼接路径,在路径末尾自带分隔符、跨操作系统运行等特殊场景下,容易出现路径格式错误。
- 单文件发布兼容问题:如果你使用的是.NET Core 3.0+ / .NET 5+的单文件发布模式,
Assembly.GetExecutingAssembly().Location会返回空值,最终拼接出来的路径无效。
修复方案
- 首先配置文件复制规则:在你的库项目中找到
Utilities文件夹下的app.exe,右键打开属性面板,将复制到输出目录选项设置为如果较新则复制,确保编译后文件会被输出到正确的路径下。 - 优化路径拼接逻辑,使用
Path.Combine替代直接字符串拼接,同时兼容单文件发布场景:
static void Main(string[] args) { // 优先取执行程序集目录,兼容单文件发布场景回退到AppContext基目录 string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); if (string.IsNullOrEmpty(assemblyDir)) { assemblyDir = AppContext.BaseDirectory; } string consoleApp = Path.Combine(assemblyDir, "Utilities", "app.exe"); // 提前校验文件是否存在,避免抛出系统级异常方便排查 if (!File.Exists(consoleApp)) { Console.WriteLine($"目标应用不存在,路径:{consoleApp}"); return; } // 注意:此处参数你当前传的是app.exe自身的路径,确认是否符合业务逻辑,如需传入其他参数自行修改 string param = string.Format("-v quiet \"{0}\"", consoleApp); ProcessStartInfo pi = new ProcessStartInfo(consoleApp, param) { // 显式设置工作目录,避免部分场景下工作目录异常导致的依赖加载问题 WorkingDirectory = Path.GetDirectoryName(consoleApp), UseShellExecute = false }; Process mProcess = Process.Start(pi); Console.WriteLine(pi); }
- 如果上述操作后还是报错,可以打印出拼接得到的
consoleApp路径,手动检查该路径下是否真的存在app.exe文件,排查是否有编译输出目录配置错误的问题。
内容的提问来源于stack exchange,提问作者Rabner Casandara
相关产品推荐
相关产品推荐

