You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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下的相对路径即可,替换你代码里的硬编码全路径:
举几个你代码里的替换示例:

  1. 读取高分文件
// 替换原来的硬编码全路径
private double highscore = double.Parse(File.ReadAllText(Path.Combine(AppRootPath, @"assets\highscore.txt")));
  1. 加载音频文件
// 比如加载boom.wav
player.Open(new Uri(Path.Combine(AppRootPath, @"assets\audio\boom.wav")));
  1. 图片路径也可以统一用这种写法(兼容原来的写法,更稳定)
bird.Source = new BitmapImage(new Uri(Path.Combine(AppRootPath, @"assets\images\deadBird.png")));

第三步:配置资源文件自动复制

要保证编译后assets文件夹会同步到exe输出目录:

  • 在VS解决方案资源管理器里,选中assets文件夹下的所有文件(图片、音频、txt等)
  • 右键点击「属性」,在属性面板里把「复制到输出目录」设置为「如果较新则复制」
  • 重新编译项目即可

这样所有资源路径就统一了,不管是开发调试还是打包发布给其他人用,路径都不会失效。


内容的提问来源于stack exchange,提问作者iceflare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:15:04