You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置修复方案

可以通过调整链接器规则解决,不需要修改业务代码:

  1. 右键解决方案中的安卓平台项目 → 选择「属性」→ 进入「Android选项」→ 打开「链接器」配置页
  2. 先将链接器行为修改为「仅裁剪SDK程序集」,重新编译Release版本测试,如果问题消失即可确认是裁剪导致
  3. 如果需要保留「裁剪所有程序集」的优化效果,可添加自定义链接器保留规则:
    • 在安卓项目根目录新建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,提问作者韩方圆

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:30:00