从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
相关产品推荐
相关产品推荐

