- A+
所属分类:.NET技术
.NET C#程序启动闪退,目录导致的问题
这是第2次踩这个坑了,很小的编程细节,容易忽略,所以写个博客,分享给大家。
1.第一次坑:是windows 系统把程序运行成服务,找不到配置文件,原因是以服务运行它的工作目录是在C:WindowsSystem32
2.本次坑:WPF桌面程序通过注册表设置开机自启,开机启动就闪退
我的排查流程:
1.使用注册表中配置的绝对路径,直接进入该文件夹中双击运行,验证程序和路径正确性,结果:失败。但管理员却能运行。原因是inno setup打包的时候设置了需要管理员运行。于是重新打包。虽然直接双击可以运行,但开机自启依然不行
2.于是我换了一个方式,在文件夹管理器直接使用绝对路径访问运行,结果:失败。当时怀疑,问题依然是:权限或者打包软件问题,但经过反复验证是正常的,于是问了一下gpt,他给了一个方向:(应用程序依赖资源文件路径问题: 如您的应用程序在运行时依赖于某些资源文件(如配置文件、数据库文件、dll等)。我当时想都能正常运行肯定没问题,但大脑还是抱着质疑的态度在脑海里面扫描一遍可能出现路径暗坑的代码,然后灵感一闪,想起来我的配置文件读取只写了一个文件名,原因也是程序工作目录导致的,然后进行代码修正,完美解决
原因
如果您通过某个路径间接启动程序(例如通过快捷方式、命令行指定的目录或是其他方式),这时当前工作目录可能不再是程序本身的目录,而是变成了启动程序的所在目录或者是命令行指定的工作目录,这就可能导致程序无法找到(如配置文件、数据库文件、dll等) 文件
解决方案
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "文件名.json")
所以大家编程的时候操作文件资源相关代码路径推荐这种写法,避免通过其他方式启动的时候程序崩溃。除非你希望你的文件资源在工作目录下操作,但这样会导致不可控,不建议