在Mono.Android与Xamarin.iOS中使用System.Drawing.Common遇阻求助
核心原因先搞清楚
从.NET Core 3.0版本开始,System.Drawing.Common就被官方标记为仅支持Windows平台。NuGet包里只包含适配Windows桌面框架的二进制文件,没有针对Android、iOS移动平台的实现。所以你在Mono.Android或Xamarin.iOS项目里安装这个包后,项目根本识别不到有效引用,自然看不到组件、调用不了System.Drawing.Bitmap类。
针对你的问题的具体解决方案
1. 替代System.Drawing.Bitmap的可行方案
既然官方不支持移动平台,就得换用适配环境的图形处理方案,这里有两个靠谱方向:
用平台原生API(推荐,性能最优)
- Android平台:直接使用Android系统提供的
Android.Graphics.Bitmap类,它完全适配Android环境,能实现加载、裁剪、缩放、像素操作等所有你需要的图形功能,和System.Drawing.Bitmap的能力对齐。 - iOS平台:使用iOS原生的
UIKit.UIImage和CoreGraphics.CGImage组合,这是iOS系统原生的图形处理组件,满足日常图片操作需求毫无问题。
- Android平台:直接使用Android系统提供的
用跨平台图形库(如果需要跨多平台复用代码)
推荐使用SkiaSharp,这是谷歌Skia图形引擎的.NET绑定,支持Windows、Android、iOS、macOS等几乎所有主流平台,API设计和System.Drawing非常接近,迁移成本低,而且是微软官方推荐的跨平台图形解决方案。比如替换System.Drawing.Bitmap的话,你可以用SkiaSharp.SKBitmap:using SkiaSharp; // 加载图片示例 var skBitmap = SKBitmap.Decode("your_image_path.png"); // 后续的裁剪、缩放等操作逻辑,和System.Drawing的用法高度相似
2. 关于NuGet包引用不显示的问题
你检查包文件夹会发现,System.Drawing.Common的NuGet包里只有针对netcoreapp3.0+、net5.0-windows这类Windows相关框架的dll,完全没有Android(monoandroid)或iOS(xamarinios)的目标框架文件。所以项目安装包后,找不到适配当前平台的引用,自然不会在引用列表里显示,也没法调用任何类。
如果实在想尝试(不推荐生产环境),可以安装System.Drawing.Common 2.x版本的旧包——那个版本还没限制平台支持,但旧版本已经停止维护,可能存在兼容性和安全性问题,谨慎使用。
内容的提问来源于stack exchange,提问作者leo.luo

