System.Runtime.InteropServicesExternalException 发生在 System.Drawing.dll

System.Runtime.InteropServicesExternalException occured in System.Drawing.dll

我有一个 28MB 的动画 gif 作为嵌入式资源,我正试图将其加载到我的 'About' 表单中。

表单代码如下:

关于

private void About_Load(object sender, EventArgs e)
{
    pictureBox1.Image = EmbeddedResources.image("mygif.gif");
}

嵌入式资源(简体)

public class EmbeddedResources
{
    public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }

    public static Image image(string name)
    {
        Image result = null;
        using (Stream res = self.GetManifestResourceStream("MyProject." + name))
        {
            result = Image.FromStream(res);
        }
        return result;
    }

}

代码似乎没有问题找到资源,因为 EmbeddedResources.image() 中的 result 填充了数据(非空),pictureBox1.Image = EmbeddedResources.image("mygif.gif"); 行 [=19] =] 似乎可以无误地传递数据,但是在加载表单后,在 ShowDialog() 方法上出现以下异常。

这是我用来加载和显示 About 表单的代码(来自不同的表单.. Form1)。

private void button1_Click(object sender, EventArgs e)
{
    About frm = new About();
    frm.ShowDialog(this);
}

为什么我会收到此异常,我需要做些什么来修复它以便我的动画 gif(大约 30 秒循环)可以加载?(即尽管我可以得到循环并认为使用动画 gif 比乱用过时的 activex/com 媒体控件或旧的 directx 框架来支持视频作为背景然后不得不在视频上添加控件更简单 - - 大混乱的噩梦)

堆栈跟踪

   at System.Drawing.Image.SelectActiveFrame(FrameDimension dimension, Int32 frameIndex)
   at System.Drawing.ImageAnimator.ImageInfo.UpdateFrame()
   at System.Drawing.ImageAnimator.UpdateFrames(Image image)
   at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

好吧,我很遗憾没有早点发现这个。问题是通过将 Stream 访问包装在 using 块中,Stream 在完成时被处理。我以前见过这种情况,并且一直想知道它的后果。现在我知道后果了。

一个简单的修复,不要Dispose流。

public class EmbeddedResources
{
    public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }

    public static Image image(string name)
    {
        Image result = null;

        // note: typeof(EmbeddedResources).Namespace will only work if EmbeddedResources is defined in the default namespace
        Stream res = self.GetManifestResourceStream(typeof(EmbeddedResources).Namespace + "." + name);
        result = Image.FromStream(res);
        return result;
    }

}