无法从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 类型的参数
  • 两者类型不兼容,必须通过流进行转换

完整的转换逻辑说明:

  1. MemoryStream 将字节数组包装成流对象
  2. 使用 Icon 类的构造函数从流创建图标对象
  3. 将创建好的 Icon 对象传递给 WindowsTrayIcon 构造函数

这样就能解决类型不匹配的问题,确保图标能正确加载到系统托盘。