Xamarin UWP Release模式下EmbeddedFileProvider报平台不支持错误如何解决
根因分析
- 该问题本质是Xamarin UWP Release模式默认启用*.NET Native工具链编译*时,对Microsoft.Extensions.Configuration相关依赖的嵌入式资源读取逻辑做了过度裁剪,
EmbeddedFileProvider依赖的反射调用、嵌入式资源寻址接口在裁剪后丢失了必要的元数据和平台兼容实现,因此抛出平台不支持错误。 - Debug模式未启用.NET Native编译,不会触发裁剪逻辑,因此运行正常。
可行临时解决方案
除你已使用的读取物理文件方案外,还有两个更轻量的替代方案:
方案1:直接读取嵌入式资源流加载配置,绕过EmbeddedFileProvider
无需依赖EmbeddedFileProvider,直接通过Assembly读取嵌入式appsettings.json的流,再添加到ConfigurationBuilder中,代码示例:
var assembly = typeof(AppStartup).Assembly; using var stream = assembly.GetManifestResourceStream("你的项目命名空间.appsettings.json"); var config = new ConfigurationBuilder() .AddJsonStream(stream) .Build();
该方案不需要修改配置文件的生成属性,也无需把配置文件放到输出目录,和原本的嵌入式加载逻辑使用体验一致,不会触发EmbeddedFileProvider的平台兼容问题。
方案2:在.NET Native裁剪规则中保留Configuration相关程序集的元数据
在UWP项目的Default.rd.xml文件中添加如下裁剪排除规则,避免.NET Native裁剪掉Configuration依赖的必要类型:
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <Assembly Name="Microsoft.Extensions.Configuration" Dynamic="Required All" /> <Assembly Name="Microsoft.Extensions.Configuration.Json" Dynamic="Required All" /> <Assembly Name="Microsoft.Extensions.FileProviders.Embedded" Dynamic="Required All" /> <Assembly Name="Microsoft.Extensions.FileProviders.Abstractions" Dynamic="Required All" /> </Application> </Directives>
该方案可以保留你原来的EmbeddedFileProvider加载逻辑无需改动,缺点是会略微增大应用的包体积。
正式修复方案
- 若计划后续迁移应用到Windows App SDK(WinUI 3),可直接替换Xamarin UWP的实现,WinUI 3对.NET 6+的Microsoft.Extensions相关包兼容性完整,不存在该裁剪问题。
- 若需要继续维护Xamarin UWP版本,可向Microsoft.Extensions.Configuration官方仓库提交UWP平台兼容的PR,或等待官方发布针对Xamarin UWP .NET Native场景的兼容补丁。
内容的提问来源于stack exchange,提问作者NinjaOnSafari
相关产品推荐
相关产品推荐

