C#代码创建的程序快捷方式启动报错但原程序正常是何原因
问题产生原因
核心是两个问题共同导致的:
- 你写的创建快捷方式代码漏了
IWshShortcut的WorkingDirectory(工作目录)属性配置。直接在资源管理器里双击exe启动时,系统会默认把exe所在的文件夹设为程序的当前工作目录,你程序用相对路径找同目录下的Access数据库时,自然能正常定位到文件;但通过没指定工作目录的快捷方式启动时,程序拿到的Environment.CurrentDirectory根本不是exe所在的文件夹,大概率是系统目录、桌面这类其他路径,在这个错误路径下找数据库,当然会判定文件不存在。 - 不管是创建快捷方式时拼目标程序路径,还是程序内部找数据库,你都用了
Environment.CurrentDirectory当路径基准。这个属性的值非常不稳定,除了启动方式不同会变,程序运行时弹出文件选择对话框、调用其他修改工作目录的接口都会改掉它的值,从设计上就不适合用来定位程序自身的依赖文件。
解决方法
分两步修复,可彻底规避该类路径问题:
- 修改创建快捷方式的代码,补全工作目录配置,同时改用程序集自身路径作为目标路径基准,不再依赖
Environment.CurrentDirectory
修正后的快捷方式创建代码如下:
private void CreateShortcut() { // 直接从程序集信息获取exe的完整路径和所在目录,不受当前工作目录影响 string exeFullPath = System.Reflection.Assembly.GetExecutingAssembly().Location; string exeDir = System.IO.Path.GetDirectoryName(exeFullPath); object shDesktop = (object)"Desktop"; WshShell shell = new WshShell(); string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\Baseet.lnk"; IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress); shortcut.Description = "Baseet Program"; shortcut.Hotkey = "Ctrl+Shift+N"; shortcut.TargetPath = System.IO.Path.Combine(exeDir, "Start_Baseet.exe"); // 必须给快捷方式指定工作目录为exe所在文件夹 shortcut.WorkingDirectory = exeDir; shortcut.Save(); }
- 修改程序内部定位Access数据库的逻辑,不要直接用相对文件名判断存在性,固定以exe所在目录为基准拼接数据库的完整路径,示例代码:
// 替换原来直接写相对文件名判断文件存在的逻辑 string exeDir = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); string dbPath = System.IO.Path.Combine(exeDir, "你的Access数据库实际文件名.accdb"); if (!System.IO.File.Exists(dbPath)) { // 触发数据库缺失的提示逻辑 }
如果是WinForm项目,也可以用
Application.StartupPath获取exe所在目录,效果一致。
内容的提问来源于stack exchange,提问作者Csharp Newbie
相关产品推荐
相关产品推荐

