UWP中如何从引用的程序集读取资源文件?
从UWP引用程序集读取资源文件的正确姿势
首先得明确:你之前用的ms-appx:/// URI只能访问主应用包内的文件,引用的程序集里的资源如果是普通的Content设置,并不会自动放到主包的根目录,所以直接用这个URI肯定找不到。下面给你两种最常用的靠谱方案,根据你的资源类型选就行:
方案1:把类库资源设为Content,用带程序集名的URI访问
如果你的资源文件(比如文本、图片)在引用的类库中,先做两个关键设置:
- 选中资源文件,在属性面板里把生成操作设为
Content,复制到输出目录设为始终复制 - 记住类库的程序集名称(就是项目属性里的“程序集名称”,不是项目文件夹名哦)
然后就可以用带程序集名的ms-appx:/// URI来访问了,格式是:
var file = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync( new Uri($"ms-appx:///[你的类库程序集名称]/[资源文件相对路径]") );
举个例子:如果你的类库程序集名叫MyUwpClassLibrary,资源文件在类库的Assets文件夹下叫data.txt,那URI就是ms-appx:///MyUwpClassLibrary/Assets/data.txt
方案2:把资源设为Embedded Resource,通过程序集读取流
如果不想把资源暴露在包目录里,或者需要更灵活的流读取,可以把资源设为Embedded Resource:
- 选中资源文件,属性面板里把生成操作设为
Embedded Resource,复制到输出目录可以设为不复制 - 获取类库的程序集实例,然后读取资源流:
// 先获取类库中任意类型的Type,用来定位程序集 var assembly = typeof(MyUwpClassLibrary.MyClass).GetTypeInfo().Assembly; // 资源名称格式是:[程序集名称].[资源文件的相对路径(把/换成.)] // 比如类库中Assets/data.txt,程序集名MyUwpClassLibrary,资源名就是MyUwpClassLibrary.Assets.data.txt using (var stream = assembly.GetManifestResourceStream("MyUwpClassLibrary.Assets.data.txt")) { // 这里可以读取流内容,比如转成字符串 using (var reader = new StreamReader(stream)) { var content = await reader.ReadToEndAsync(); // 处理内容 } }
⚠️ 注意:资源名称的格式很容易错,你可以用assembly.GetManifestResourceNames()方法列出所有嵌入的资源名称,对照着找你要的那个,避免拼写错误。
额外提示
如果是类库中的resw字符串资源,直接用ResourceLoader指定资源所在的程序集即可:
var loader = ResourceLoader.GetForViewIndependentUse("MyUwpClassLibrary/Resources"); var text = loader.GetString("HelloWorld");
这里的Resources是类库中resw文件的名称(不带后缀)。
内容的提问来源于stack exchange,提问作者resp78
相关产品推荐
相关产品推荐

