System.Runtime.InteropServicesExternalException произошла в System.Drawing.dll
У меня есть встроенный ресурс размером 28 МБ, который я пытаюсь загрузить в форму "О программе".
Код формы выглядит следующим образом:
Около
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);
}
Почему я получаю это исключение, и что мне нужно сделать, чтобы исправить это, чтобы мой анимированный 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)
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;
}
}