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

WINUI3应用打包后自定义文件/图片无法加载问题求助

解决WinUI3打包后读取自定义文件的权限拒绝问题

问题根源

WindowsApps目录是WinUI3/MSIX应用的受保护安装目录,应用自身拥有该目录的读取权限,但出现权限错误通常是两个原因:

  • 文件未被正确包含到安装包中
  • 使用了非WinUI3推荐的路径获取方式(如AppDomain.CurrentDomain.BaseDirectory),导致路径解析异常

可行解决方案

1. 确保文件被正确打包进安装包

  • 对所有自定义文件(文本、图片)设置以下属性:
    • Build Action:设为Content
    • Copy to Output Directory:设为Copy if newer或Copy always
  • 若使用单独的MSIX打包项目,需确认打包项目已包含主项目的Assets目录(通常通过引用主项目自动同步,也可手动检查打包项目的文件列表)
  • 验证方式:将生成的MSIX安装包后缀改为.zip并解压,检查是否存在Assets/Contents/Docs/Countries.txt等目标文件

2. 使用WinUI3标准API获取安装目录

放弃AppDomain.CurrentDomain.BaseDirectory,改用UWP/WinUI3官方推荐的Package.Current.InstalledLocation获取应用安装目录,该API能准确解析打包后的路径,且避免权限问题:

异步读取(推荐,符合WinUI3异步模型)

using Windows.ApplicationModel;
using Windows.Storage;

public async Task<string> ReadCountriesFileAsync()
{
    // 获取应用安装目录
    StorageFolder installFolder = Package.Current.InstalledLocation;
    // 获取目标文件
    StorageFile countriesFile = await installFolder.GetFileAsync(@"Assets\Contents\Docs\Countries.txt");
    // 读取文件内容
    return await FileIO.ReadTextAsync(countriesFile);
}

同步读取(仅在特殊场景下使用)

using Windows.ApplicationModel;
using System.IO;

public string ReadCountriesFile()
{
    // 获取安装目录路径
    string installPath = Package.Current.InstalledLocation.Path;
    string countriesListPath = Path.Combine(installPath, @"Assets\Contents\Docs\Countries.txt");
    // 同步读取文件
    return File.ReadAllText(countriesListPath);
}

3. 额外排查步骤

  • 若仍触发权限错误,检查应用的Package.appxmanifest,确认没有误加限制类权限(读取自身安装目录无需额外权限,但需确保未禁用基础文件访问)
  • 确认主项目和打包项目的目标Windows版本一致(如均为Windows 10 19041+)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:32:22