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;
}
}
我有一个 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;
}
}