2

我一直在使用此代码在图片框中显示一个图标。

Image FromIcon(Icon ico)
{
    try
    {
        this.toolTip1.SetToolTip(pictureBox1, "The icon of the Executable");
        return ico.ToBitmap();
    }
    catch (Exception e)
    {
        this.toolTip1.SetToolTip(pictureBox1, "Don't worry, it looks perfectly fine on the executable!");
        MessageBox.Show(e.Message + "\r\n" + e.StackTrace);
        Clipboard.SetText(e.Message + "\r\n" + e.StackTrace);

        // Alternate method             
        return Bitmap.FromHicon(ico.Handle);
    }
}

但是它显示了这个错误。

Requested range extends past the end of the array.
   at System.Runtime.InteropServices.Marshal.CopyToNative(Object source, Int32 startIndex, IntPtr destination, Int32 length)
   at System.Runtime.InteropServices.Marshal.Copy(Byte[] source, Int32 startIndex, IntPtr destination, Int32 length)
   at System.Drawing.Icon.ToBitmap()

图标也以令人讨厌的方式显示,

在此处输入图像描述

这与我用于我的应用程序的图标相同。会出什么问题?

该图标是 32 位以及另一个。

在此处输入图像描述

如果我使用另一个图标,它可以正常工作并且不会弹出错误。

在此处输入图像描述

4

1 回答 1

1

我知道这是一个老问题,但我最近遇到了同样的问题,所以我想我会为面临同样问题的其他人发布解决方案。

对我来说,问题是我正在从 PNG 图像格式创建 ICO 文件,但使用这些文件的应用程序针对的是早于 4.6 的 .NET 框架(即在 . ico 文件)。请参阅下面的 Icon.ToBitmap() 文档中的注释:

从框架版本 4.6 开始,为 .ico 文件中的 PNG 帧添加了支持。针对框架早期版本但在 4.6 位上运行的应用程序可以通过将以下行添加到 app.config 文件的 <runtime> 部分来选择加入新行为:<AppContextSwitchOverrides value="Switch.System.Drawing .DontSupportPngFramesInIcons=false" />

因此,一旦我将上述行添加到 app.config 文件中,它就解决了问题。

于 2018-06-05T08:57:24.300 回答