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

从UWP访问.NET Standard 2.0类库中嵌入资源为StorageFile

从UWP访问.NET Standard 2类库中嵌入资源并返回StorageFile的方法

嘿,你之前尝试用ms-appx:/// Uri的路子走不通是有原因的——当你把文件设为EmbeddedResource时,它是直接嵌入到类库的DLL程序集里的,并不是作为独立文件存放在UWP的appx包目录中,系统自然找不到这个Uri对应的文件。

我给你整理了一套可行的方案,核心思路是先从类库程序集里把嵌入的资源流读出来,再把这个流写到UWP本地可访问的存储位置,最后就能拿到你要的StorageFile了:

1. 先搞对嵌入式资源的完整名称

嵌入式资源的名称不是物理路径,而是项目根命名空间+文件路径(把斜杠换成点)。举个例子:如果你的Shared项目根命名空间是Shared,文件存放在Shared/Reports/MyReport.pdf,那资源的完整名称就是Shared.Reports.MyReport.pdf。

你可以通过右键Shared项目→属性→资源页,或者直接查看项目的.csproj文件里的<EmbeddedResource>节点,确认这个名称是否正确——这步很重要,名称错了后面肯定读不到流。

2. 从类库程序集里读取资源流

在UWP项目里先引用你的Shared类库,然后用反射拿到类库的程序集,再读取资源流:

// 用类库中任意一个已知类来定位程序集(比如假设你有个ReportHelper类在Shared里)
var assembly = typeof(ReportHelper).Assembly;
// 替换成你自己的资源完整名称
string resourceFullName = "Shared.Reports.MyReport.pdf";
using Stream resourceStream = assembly.GetManifestResourceStream(resourceFullName);

if (resourceStream == null)
{
    throw new FileNotFoundException("找不到指定的嵌入式资源,请检查资源名称是否正确", resourceFullName);
}

如果你的类库没有现成的类可以用来定位程序集,也可以直接用程序集名称加载:Assembly.Load(new AssemblyName("Shared")),不过前者更稳妥。

3. 把流写入本地存储并获取StorageFile

接下来把读取到的流写入到UWP的本地存储(比如临时文件夹或本地文件夹,临时文件夹的文件会被系统自动清理,本地文件夹则会持久保存,按需选择):

// 这里用临时文件夹做示例,你也可以换成ApplicationData.Current.LocalFolder
StorageFolder targetFolder = ApplicationData.Current.TemporaryFolder;
// 创建目标文件,文件名可以和原文件一致,ReplaceExisting表示如果已存在就覆盖
StorageFile targetFile = await targetFolder.CreateFileAsync("MyReport.pdf", CreationCollisionOption.ReplaceExisting);

// 将资源流写入到目标文件中
using (Stream fileStream = await targetFile.OpenStreamForWriteAsync())
{
    await resourceStream.CopyToAsync(fileStream);
}

// 现在targetFile就是你需要的StorageFile对象了,直接用就行

一些额外提醒

  • 记得处理资源流为空的情况,避免出现空引用异常。
  • 如果这个文件需要频繁使用,建议做个缓存,不用每次都从程序集读取再写入,能提升不少性能。
  • 要是你的资源文件名里有特殊字符,注意转义或者调整命名空间+路径的组合,确保资源名称正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:18:33