System.Drawing.dll中出现System.Runtime.InteropServicesExternalException

时间:2016-08-19 21:32:39

标签: c# winforms picturebox animated-gif

我有一个28MB的动画gif作为嵌入式资源,我试图加载到我的'关于'形式。

表格代码如下:

关于

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

EmbeddedResources(简化)

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;
    }

}

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

这是我正在使用的代码(来自另一种形式.. About)来加载和显示private void button1_Click(object sender, EventArgs e) { About frm = new About(); frm.ShowDialog(this); } 表单。

   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)

enter image description here

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

堆栈跟踪

{{1}}

1 个答案:

答案 0 :(得分:1)

好的,我很尴尬,我没有早点抓住这个。问题是,通过将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;
    }

}