Xamarin.Forms开发安卓应用Release模式下File.ReadAllBytes()报错如何解决?
问题根因
- 最常见的原因是Xamarin.Android Release模式的托管链接器裁剪机制:Debug模式下默认关闭裁剪或仅裁剪SDK未使用的基础库,会完整保留
System.IO.File类的所有方法;Release模式下如果开启了「裁剪所有程序集」的优化选项,链接器静态分析时可能误判ReadAllBytes方法未被调用,直接将其从编译后的程序集中移除,最终抛出你遇到的错误:
System.IO.File does not contain a definition for ReadAllBytes
- 小概率是项目的框架版本不兼容:如果共享类库和安卓平台项目的目标.NET标准/.NET版本不一致,也可能出现API缺失问题,但这种情况通常Debug模式也会报错。
Visual Studio配置修复方案
可以通过调整链接器规则解决,不需要修改业务代码:
- 右键解决方案中的安卓平台项目 → 选择「属性」→ 进入「Android选项」→ 打开「链接器」配置页
- 先将链接器行为修改为「仅裁剪SDK程序集」,重新编译Release版本测试,如果问题消失即可确认是裁剪导致
- 如果需要保留「裁剪所有程序集」的优化效果,可添加自定义链接器保留规则:
- 在安卓项目根目录新建
linker.xml文件,写入以下内容:
- 在安卓项目根目录新建
<linker> <assembly fullname="mscorlib"> <type fullname="System.IO.File" preserve="all" /> </assembly> </linker>
- 右键
linker.xml文件 → 把「生成操作」设置为LinkDescription - 重新编译Release版本即可
替代读取方案
如果不想修改配置,也可以直接替换File.ReadAllBytes的实现,以下两种方案都不会触发裁剪问题:
- 方案1:用FileStream手动读取字节,实现和
ReadAllBytes完全一致的效果:
public byte[] GetImageBytes(string path) { using var fs = new FileStream(path, FileMode.Open, FileAccess.Read); var bytes = new byte[fs.Length]; fs.Read(bytes, 0, bytes.Length); return bytes; }
- 方案2:如果读取的是Assets/资源目录或系统媒体库的图片,直接使用安卓原生的
AssetManager或ContentResolver读取,兼容性更好,适配所有安卓版本。
内容的提问来源于stack exchange,提问作者韩方圆
相关产品推荐
相关产品推荐

