Xamarin.UWP发布版嵌入图片报错,调试版正常求解决方案
Xamarin.UWP发布模式下嵌入图片报错System.PlatformNotSupportedException的解决思路
1. 确认图片资源的生成属性
- 右键目标图片文件(
pic.ico),打开属性面板 - 确保Build Action设置为
Embedded Resource - 切换到发布配置,检查UWP项目发布设置,关闭可能移除未使用资源的选项,避免图片被优化丢弃
2. 动态绑定程序集,修复资源查找逻辑
硬编码资源ID在发布模式下可能因程序集优化、重命名导致失效,修改EmbeddedImg类,动态获取当前程序集:
internal class EmbeddedImg : IMarkupExtension { public string ResourceId { get; set; } public object ProvideValue(IServiceProvider serviceProvider) { var assembly = typeof(EmbeddedImg).GetTypeInfo().Assembly; return ImageSource.FromResource(ResourceId, assembly); } }
3. 调整UWP发布模式的编译设置
- 打开UWP项目属性的生成选项卡,切换到发布配置
- 若启用了.NET Native编译,在
Default.rd.xml中添加资源保留规则,防止资源被编译优化移除:
<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata"> <Application> <Assembly Name="*Application*" Dynamic="Required All"/> <Type Name="EmbImg.Picture.pic.ico" Dynamic="Required All"/> </Application> </Directives>
4. 排除资源与相关类的混淆(若启用混淆)
- 若项目使用混淆工具,需排除图片所在命名空间(
EmbImg.Picture)不被混淆 - 排除
EmbeddedImg类的混淆,确保XAML能正确解析该标记扩展
5. 验证资源ID的准确性
发布模式下可通过代码输出所有资源名称,确认目标资源ID是否正确:
var assembly = typeof(EmbeddedImg).GetTypeInfo().Assembly; foreach (var resourceName in assembly.GetManifestResourceNames()) { System.Diagnostics.Debug.WriteLine(resourceName); }
将这段代码加入初始化逻辑,查看输出的资源名称,与你使用的EmbImg.Picture.pic.ico对比,确保完全一致。
内容的提问来源于stack exchange,提问作者jjctw1969
相关产品推荐
相关产品推荐

