C# WPF项目本地路径转程序集相对路径的解决方案
解决方案
路径不一致的原因
WPF中不同API的默认路径寻址逻辑不一样:
- BitmapImage指定
UriKind.RelativeOrAbsolute时,会默认从程序集所在目录查找资源 - 而MediaPlayer、File类等API默认使用的是进程工作目录,调试、通过快捷方式启动等场景下工作目录会变化,就会导致相对路径失效。
统一路径的实现方法
第一步:获取稳定的程序根目录
我们用AppContext.BaseDirectory来获取exe编译输出的固定根目录,这个值不受启动方式影响,永远指向程序集所在文件夹。你可以在MainWindow类里加一个静态属性存这个路径:
// 放在MainWindow类里,和其他私有变量同级即可 public static string AppRootPath = System.AppContext.BaseDirectory;
第二步:统一用Path.Combine拼接相对路径
所有资源路径都通过Path.Combine拼接根目录和你assets下的相对路径即可,替换你代码里的硬编码全路径:
举几个你代码里的替换示例:
- 读取高分文件
// 替换原来的硬编码全路径 private double highscore = double.Parse(File.ReadAllText(Path.Combine(AppRootPath, @"assets\highscore.txt")));
- 加载音频文件
// 比如加载boom.wav player.Open(new Uri(Path.Combine(AppRootPath, @"assets\audio\boom.wav")));
- 图片路径也可以统一用这种写法(兼容原来的写法,更稳定)
bird.Source = new BitmapImage(new Uri(Path.Combine(AppRootPath, @"assets\images\deadBird.png")));
第三步:配置资源文件自动复制
要保证编译后assets文件夹会同步到exe输出目录:
- 在VS解决方案资源管理器里,选中assets文件夹下的所有文件(图片、音频、txt等)
- 右键点击「属性」,在属性面板里把「复制到输出目录」设置为「如果较新则复制」
- 重新编译项目即可
这样所有资源路径就统一了,不管是开发调试还是打包发布给其他人用,路径都不会失效。
内容的提问来源于stack exchange,提问作者iceflare
相关产品推荐
相关产品推荐

