无法从byte[]转换为System.Drawing.Icon
无法从byte[]转换为System.Drawing.Icon
System.InvalidCastException:“Unable to cast object of type 'System.Byte[]' to type 'System.Drawing.Icon'.”
为什么我在resource中添加的图标ico资源是System.Byte[]类型 而不是System.Drawing.
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS1503 参数 1: 无法从“byte[]”转换为“System.Drawing.Icon” TodoReminderApp (net8.0-windows10.0.19041.0) F:\Merchant\project\todotask\TodoReminderApp\TodoReminderApp\Platforms\Windows\TrayService.cs 23 活动
//tray = new WindowsTrayIcon(Resource.trayicon); 资源添加默认为二进制处理
解决方案:1 复制System.Drawing.格式的过来
2 直接转换var icon = new System.Drawing.Icon(stream);
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS1069 未能在命名空间“System.Drawing”中找到类型名“Icon”。此类型已转发到程序集“System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”。请考虑添加对该程序集的引用。 TodoReminderApp (net8.0-android), TodoReminderApp (net8.0-ios), TodoReminderApp (net8.0-maccatalyst) F:\Merchant\project\todotask\TodoReminderApp\TodoReminderApp\Resource.Designer.cs 79 活动
//tray = new WindowsTrayIcon(Resource.trayicon); using (var stream = new MemoryStream(Resource.trayicon)) { var icon = new System.Drawing.Icon(stream); tray = new WindowsTrayIcon(icon); }
这个错误是因为你直接将字节数组(byte[])传递给了需要 System.Drawing.Icon 类型参数的构造函数,两者需要先将字节数组转换为流,再用流创建 Icon 对象。错误原因分析:
Resource.trayicon是字节数组(byte[])类型,这是资源文件的原始存储形式WindowsTrayIcon构造函数需要的是System.Drawing.Icon类型的参数- 两者类型不兼容,必须通过流进行转换
完整的转换逻辑说明:
- 用
MemoryStream将字节数组包装成流对象 - 使用
Icon类的构造函数从流创建图标对象 - 将创建好的
Icon对象传递给WindowsTrayIcon构造函数
这样就能解决类型不匹配的问题,确保图标能正确加载到系统托盘。