使用Process.Start运行.lnk快捷方式抛出Win32Exception求助
问题:Process.Start调用.lnk快捷方式失败,双击可正常运行
手动为.exe程序创建的快捷方式,双击能正常启动程序,但通过Process.Start调用该快捷方式时抛出异常。
调用代码
var myProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "D:\\shortcut.lnk" } }; myProcess.Start();
抛出异常
调用myProcess.Start()时出现:
System.ComponentModel.Win32Exception: No application is associated with the specified file for this operation。
尝试过以下方案均无效:
- 将目标平台设置为x64,仍抛出相同异常;
- 设置
ErrorDialog = true,异常以弹窗形式出现,问题依旧; - 设置
UseShellExecute = true,仍抛出相同异常; - 设置
UseShellExecute = false,抛出异常:System.ComponentModel.Win32Exception: The specified executable is not a valid Win32 application。
问题在Windows 8/10/11系统、.NET Framework 4.7.2环境下均复现。
解决方案
方案1:通过cmd命令启动快捷方式
利用cmd.exe的start命令处理.lnk文件,绕过Process.Start直接处理的限制:
var myProcess = new Process { StartInfo = new ProcessStartInfo { FileName = "cmd.exe", Arguments = "/c start \"\" \"D:\\shortcut.lnk\"", WindowStyle = ProcessWindowStyle.Hidden // 可选,隐藏cmd窗口 } }; myProcess.Start();
方案2:解析快捷方式目标路径,直接启动原程序
通过Shell32 COM组件解析.lnk指向的原.exe路径,直接启动目标程序:
- 项目中添加COM引用:
Microsoft Shell Controls And Automation(对应Shell32.dll) - 使用以下代码解析并启动:
using Shell32; using System.IO; public string GetShortcutTarget(string shortcutPath) { var shell = new Shell(); var folder = shell.NameSpace(Path.GetDirectoryName(shortcutPath)); var folderItem = folder.ParseName(Path.GetFileName(shortcutPath)); if (folderItem != null && folderItem.IsLink) { var link = (ShellLinkObject)folderItem.GetLink; return link.Path; } return null; } // 调用示例 var targetExePath = GetShortcutTarget("D:\\shortcut.lnk"); if (!string.IsNullOrEmpty(targetExePath)) { Process.Start(targetExePath); }
方案3:调用Windows API ShellExecuteEx直接处理
通过P/Invoke调用系统原生的ShellExecuteEx函数处理快捷方式:
using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHELLEXECUTEINFO { public int cbSize; public uint fMask; public IntPtr hwnd; [MarshalAs(UnmanagedType.LPWStr)] public string lpVerb; [MarshalAs(UnmanagedType.LPWStr)] public string lpFile; [MarshalAs(UnmanagedType.LPWStr)] public string lpParameters; [MarshalAs(UnmanagedType.LPWStr)] public string lpDirectory; public int nShow; public IntPtr hInstApp; public IntPtr lpIDList; [MarshalAs(UnmanagedType.LPWStr)] public string lpClass; public IntPtr hkeyClass; public uint dwHotKey; public IntPtr hIcon; public IntPtr hProcess; } [DllImport("shell32.dll", CharSet = CharSet.Unicode)] public static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo); public bool LaunchShortcut(string shortcutPath) { var sei = new SHELLEXECUTEINFO(); sei.cbSize = Marshal.SizeOf(sei); sei.fMask = 0x00000040; // SEE_MASK_NOCLOSEPROCESS sei.lpVerb = "open"; sei.lpFile = shortcutPath; sei.nShow = 1; // SW_SHOWNORMAL return ShellExecuteEx(ref sei); } // 调用示例 LaunchShortcut("D:\\shortcut.lnk");
内容的提问来源于stack exchange,提问作者StafordDev
相关产品推荐
相关产品推荐

